FolderBrowserDialog in .Net nachbilden

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    @VaporiZed
    -> egal, ob .NET-Framework-Dialog, Shell-Dialog, oder über WinAPI-Funktion mit einer entsprechenden Fehlermeldung quittiert.

    Die API SHBrowseForFolder sollte das können. Bei BROWSEINFO.pidlRoot kann ja eine PIDL, die z.B. von SHParseDisplayName -> SHGetIDListFromObject kommt, übergeben werden. SHParseDisplayName kann entsprechende Ordner verarbeiten. Aber: learn.microsoft.com/en-us/wind…hbrowseforfoldera#remarks

    Wie schaut es eigentlich in .NET5/6/7 aus? Ich hab mir das noch garnicht großartig angeschaut. Gibt es da auch noch die alten Dialoge? UWP-Apps z.B. verwenden ebenfalls den FolderPicker: learn.microsoft.com/en-us/uwp/…erpicker?view=winrt-22621

    Edit: Nur der Vollständigkeit Halber wie man es evtl. mit den alten Dialog machen könnte (Subclassing des Dialoges hab ich weggelassen). Was man halt braucht ist die DeviceID des Handy (in diesem Bsp ist meine DeviceID vom Handy zu sehen!) oder man navigiert einmalig zum entsprechenden Handy-Ordner, wählt diesen aus und nimmt den zurückgelieferten Pfad für den RootFolder.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Runtime.InteropServices
    4. Public Class Form1
    5. Private Const S_OK As Integer = 0
    6. Private Const MAX_PATH As Integer = 512
    7. Private Const IID_IShellItem As String = "43826d1e-e718-42ee-bc55-a1e261c37bfe"
    8. Private Enum BROWSEINFOFLAGS As UInteger
    9. BIF_RETURNONLYFSDIRS = 1
    10. BIF_DONTGOBELOWDOMAIN = 2
    11. BIF_STATUSTEXT = 4
    12. BIF_RETURNFSANCESTORS = 8
    13. BIF_EDITBOX = 16
    14. BIF_VALIDATE = 32
    15. BIF_NEWDIALOGSTYLE = 64
    16. BIF_BROWSEINCLUDEURLS = 128
    17. BIF_UAHINT = 256
    18. BIF_DONTSHOWNEWFOLDERBUTTON = 512
    19. BIF_USENEWUI = BIF_EDITBOX Or BIF_NEWDIALOGSTYLE
    20. BIF_BROWSEFORCOMPUTER = 4096
    21. BIF_BROWSEFORPRINTER = 8192
    22. BIF_BROWSEINCLUDEFILES = 16384
    23. BIF_SHAREABLE = 32768
    24. BIF_BROWSEFILEJUNCTIONS = 65536
    25. End Enum
    26. Private Enum SIGDN As Integer
    27. SIGDN_NORMALDISPLAY = &H0
    28. SIGDN_PARENTRELATIVEPARSING = &H80018001
    29. SIGDN_DESKTOPABSOLUTEPARSING = &H80028000
    30. SIGDN_PARENTRELATIVEEDITING = &H80031001
    31. SIGDN_DESKTOPABSOLUTEEDITING = &H8004C000
    32. SIGDN_FILESYSPATH = &H80058000
    33. SIGDN_URL = &H80068000
    34. SIGDN_PARENTRELATIVEFORADDRESSBAR = &H8007C001
    35. SIGDN_PARENTRELATIVE = &H80080001
    36. SIGDN_PARENTRELATIVEFORUI = &H80094001
    37. End Enum
    38. Private Structure BROWSEINFO
    39. Dim hwndOwner As IntPtr
    40. Dim pidlRoot As IntPtr
    41. <MarshalAs(UnmanagedType.LPTStr)> Dim pszDisplayName As String
    42. <MarshalAs(UnmanagedType.LPTStr)> Dim lpszTitle As String
    43. Dim ulFlags As BROWSEINFOFLAGS
    44. Dim lpfn As IntPtr
    45. Dim lParam As IntPtr
    46. Dim iImage As Integer
    47. End Structure
    48. <DllImport("shell32.dll", EntryPoint:="SHBrowseForFolderW")>
    49. Private Shared Function SHBrowseForFolder(<MarshalAs(UnmanagedType.Struct)> ByRef lpFileOp As BROWSEINFO) As IntPtr
    50. End Function
    51. <DllImport("Shell32.dll", EntryPoint:="SHCreateItemFromParsingName")>
    52. <PreserveSig> Private Shared Function SHCreateItemFromParsingName(<[In], MarshalAs(UnmanagedType.LPWStr)> pszPath As String,
    53. <[In]> pbc As IntPtr,
    54. <[In], MarshalAs(UnmanagedType.LPStruct)> riid As Guid,
    55. <Out> ByRef pUnk As IntPtr) As Integer
    56. End Function
    57. <DllImport("Shell32.dll", EntryPoint:="SHGetIDListFromObject")>
    58. <PreserveSig> Private Shared Function SHGetIDListFromObject(<[In]> pUnk As IntPtr,
    59. <Out> ByRef ppidl As IntPtr) As Integer
    60. End Function
    61. <DllImport("Shell32.dll", EntryPoint:="SHCreateShellItem")>
    62. <PreserveSig> Private Shared Function SHCreateShellItem(<[In]> pidlParent As IntPtr,
    63. <[In]> psfParent As IntPtr,
    64. <[In]> pidl As IntPtr,
    65. <Out, MarshalAs(UnmanagedType.Interface)> ByRef ppsi As IShellItem) As Integer
    66. End Function
    67. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    68. '::{20D04FE0-3AEA-1069-A2D8-08002B30309D} = ThisPC
    69. '\\?\usb#vid.... = DeviceID vom Handy
    70. Dim RootFolder As String = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_04e8&pid_6860&ms_comp_mtp&samsung_android#7&122e7c35&0&0000#{6ac27878-a6fa-4155-ba85-f98f491d4f33}"
    71. If String.IsNullOrEmpty(RootFolder) Then RootFolder = Char.MinValue
    72. Dim pIShellItem As IntPtr
    73. If SHCreateItemFromParsingName(RootFolder, IntPtr.Zero,
    74. New Guid(IID_IShellItem),
    75. pIShellItem) = S_OK Then
    76. Dim RootFolderPIDL As IntPtr
    77. If SHGetIDListFromObject(pIShellItem,
    78. RootFolderPIDL) = S_OK Then
    79. Dim BI As New BROWSEINFO
    80. With BI
    81. .hwndOwner = Me.Handle
    82. .pidlRoot = RootFolderPIDL
    83. .pszDisplayName = "DisplayName"
    84. .lpszTitle = "Title"
    85. End With
    86. Dim SelectedFolderPIDL As IntPtr = SHBrowseForFolder(BI)
    87. If SelectedFolderPIDL <> IntPtr.Zero Then
    88. Dim IShellItemSelectedFolder As IShellItem = Nothing
    89. If SHCreateShellItem(IntPtr.Zero, IntPtr.Zero, SelectedFolderPIDL, IShellItemSelectedFolder) = S_OK Then
    90. If IShellItemSelectedFolder IsNot Nothing Then
    91. Dim pwString As IntPtr
    92. If IShellItemSelectedFolder.GetDisplayName(SIGDN.SIGDN_DESKTOPABSOLUTEPARSING, pwString) = S_OK Then
    93. If pwString <> IntPtr.Zero Then
    94. Debug.Print(Marshal.PtrToStringUni(pwString))
    95. Marshal.FreeCoTaskMem(pwString)
    96. End If
    97. End If
    98. Marshal.ReleaseComObject(IShellItemSelectedFolder)
    99. End If
    100. End If
    101. Marshal.FreeCoTaskMem(SelectedFolderPIDL)
    102. End If
    103. Marshal.FreeCoTaskMem(RootFolderPIDL)
    104. End If
    105. Marshal.Release(pIShellItem)
    106. End If
    107. End Sub
    108. <ComImport>
    109. <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    110. <Guid(IID_IShellItem)>
    111. Private Interface IShellItem
    112. <PreserveSig> Function BindToHandler() As Integer ' Dummy
    113. <PreserveSig> Function GetParent() As Integer ' Dummy
    114. <PreserveSig> Function GetDisplayName(<[In]> sigdnName As SIGDN,
    115. <Out> ByRef ppszName As IntPtr) As Integer
    116. <PreserveSig> Function GetAttributes() As Integer ' Dummy
    117. <PreserveSig> Function Compare() As Integer ' Dummy
    118. End Interface
    119. End Class

    Mfg -Franky-

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „-Franky-“ ()