@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
-> 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.
VB.NET-Quellcode
- Option Strict On
- Option Explicit On
- Imports System.Runtime.InteropServices
- Public Class Form1
- Private Const S_OK As Integer = 0
- Private Const MAX_PATH As Integer = 512
- Private Const IID_IShellItem As String = "43826d1e-e718-42ee-bc55-a1e261c37bfe"
- Private Enum BROWSEINFOFLAGS As UInteger
- BIF_RETURNONLYFSDIRS = 1
- BIF_DONTGOBELOWDOMAIN = 2
- BIF_STATUSTEXT = 4
- BIF_RETURNFSANCESTORS = 8
- BIF_EDITBOX = 16
- BIF_VALIDATE = 32
- BIF_NEWDIALOGSTYLE = 64
- BIF_BROWSEINCLUDEURLS = 128
- BIF_UAHINT = 256
- BIF_DONTSHOWNEWFOLDERBUTTON = 512
- BIF_USENEWUI = BIF_EDITBOX Or BIF_NEWDIALOGSTYLE
- BIF_BROWSEFORCOMPUTER = 4096
- BIF_BROWSEFORPRINTER = 8192
- BIF_BROWSEINCLUDEFILES = 16384
- BIF_SHAREABLE = 32768
- BIF_BROWSEFILEJUNCTIONS = 65536
- End Enum
- Private Enum SIGDN As Integer
- SIGDN_NORMALDISPLAY = &H0
- SIGDN_PARENTRELATIVEPARSING = &H80018001
- SIGDN_DESKTOPABSOLUTEPARSING = &H80028000
- SIGDN_PARENTRELATIVEEDITING = &H80031001
- SIGDN_DESKTOPABSOLUTEEDITING = &H8004C000
- SIGDN_FILESYSPATH = &H80058000
- SIGDN_URL = &H80068000
- SIGDN_PARENTRELATIVEFORADDRESSBAR = &H8007C001
- SIGDN_PARENTRELATIVE = &H80080001
- SIGDN_PARENTRELATIVEFORUI = &H80094001
- End Enum
- Private Structure BROWSEINFO
- Dim hwndOwner As IntPtr
- Dim pidlRoot As IntPtr
- <MarshalAs(UnmanagedType.LPTStr)> Dim pszDisplayName As String
- <MarshalAs(UnmanagedType.LPTStr)> Dim lpszTitle As String
- Dim ulFlags As BROWSEINFOFLAGS
- Dim lpfn As IntPtr
- Dim lParam As IntPtr
- Dim iImage As Integer
- End Structure
- <DllImport("shell32.dll", EntryPoint:="SHBrowseForFolderW")>
- Private Shared Function SHBrowseForFolder(<MarshalAs(UnmanagedType.Struct)> ByRef lpFileOp As BROWSEINFO) As IntPtr
- End Function
- <DllImport("Shell32.dll", EntryPoint:="SHCreateItemFromParsingName")>
- <PreserveSig> Private Shared Function SHCreateItemFromParsingName(<[In], MarshalAs(UnmanagedType.LPWStr)> pszPath As String,
- <[In]> pbc As IntPtr,
- <[In], MarshalAs(UnmanagedType.LPStruct)> riid As Guid,
- <Out> ByRef pUnk As IntPtr) As Integer
- End Function
- <DllImport("Shell32.dll", EntryPoint:="SHGetIDListFromObject")>
- <PreserveSig> Private Shared Function SHGetIDListFromObject(<[In]> pUnk As IntPtr,
- <Out> ByRef ppidl As IntPtr) As Integer
- End Function
- <DllImport("Shell32.dll", EntryPoint:="SHCreateShellItem")>
- <PreserveSig> Private Shared Function SHCreateShellItem(<[In]> pidlParent As IntPtr,
- <[In]> psfParent As IntPtr,
- <[In]> pidl As IntPtr,
- <Out, MarshalAs(UnmanagedType.Interface)> ByRef ppsi As IShellItem) As Integer
- End Function
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- '::{20D04FE0-3AEA-1069-A2D8-08002B30309D} = ThisPC
- '\\?\usb#vid.... = DeviceID vom Handy
- 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}"
- If String.IsNullOrEmpty(RootFolder) Then RootFolder = Char.MinValue
- Dim pIShellItem As IntPtr
- If SHCreateItemFromParsingName(RootFolder, IntPtr.Zero,
- New Guid(IID_IShellItem),
- pIShellItem) = S_OK Then
- Dim RootFolderPIDL As IntPtr
- If SHGetIDListFromObject(pIShellItem,
- RootFolderPIDL) = S_OK Then
- Dim BI As New BROWSEINFO
- With BI
- .hwndOwner = Me.Handle
- .pidlRoot = RootFolderPIDL
- .pszDisplayName = "DisplayName"
- .lpszTitle = "Title"
- End With
- Dim SelectedFolderPIDL As IntPtr = SHBrowseForFolder(BI)
- If SelectedFolderPIDL <> IntPtr.Zero Then
- Dim IShellItemSelectedFolder As IShellItem = Nothing
- If SHCreateShellItem(IntPtr.Zero, IntPtr.Zero, SelectedFolderPIDL, IShellItemSelectedFolder) = S_OK Then
- If IShellItemSelectedFolder IsNot Nothing Then
- Dim pwString As IntPtr
- If IShellItemSelectedFolder.GetDisplayName(SIGDN.SIGDN_DESKTOPABSOLUTEPARSING, pwString) = S_OK Then
- If pwString <> IntPtr.Zero Then
- Debug.Print(Marshal.PtrToStringUni(pwString))
- Marshal.FreeCoTaskMem(pwString)
- End If
- End If
- Marshal.ReleaseComObject(IShellItemSelectedFolder)
- End If
- End If
- Marshal.FreeCoTaskMem(SelectedFolderPIDL)
- End If
- Marshal.FreeCoTaskMem(RootFolderPIDL)
- End If
- Marshal.Release(pIShellItem)
- End If
- End Sub
- <ComImport>
- <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
- <Guid(IID_IShellItem)>
- Private Interface IShellItem
- <PreserveSig> Function BindToHandler() As Integer ' Dummy
- <PreserveSig> Function GetParent() As Integer ' Dummy
- <PreserveSig> Function GetDisplayName(<[In]> sigdnName As SIGDN,
- <Out> ByRef ppszName As IntPtr) As Integer
- <PreserveSig> Function GetAttributes() As Integer ' Dummy
- <PreserveSig> Function Compare() As Integer ' Dummy
- End Interface
- End Class
Mfg -Franky-
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „-Franky-“ ()