Thus the basic idea is to use the following codes SHBrowseForFolder: private enum BrowseFlag {BIF_RETURNONLYFSDIRS = 0x0001, // For finding a folder to start document searching BIF_DONTGOBELOWDOMAIN = 0x0002, // For starting the Find Computer BIF_STATUSTEXT = 0x0004, BIF_RETURNFSANCESTORS = 0x0008, BIF_EDITBOX = 0x0010 , Bif_Validate = 0x0020, // Insist on Valid Result (Or Cancel)
Bif_BrowseForComputer = 0x1000, // browsing for computers. Bif_browseforprinter = 0x2000, // browsing forprinters bif_browseincludefiles = 0x4000 // browsing for everything}
[StructLayout (LayoutKind.Sequential)] private struct BrowseInfo {public IntPtr hwndOwner; public IntPtr pidlRoot; [MarshalAs (UnmanagedType.LPTStr)] public string displayname; [MarshalAs (UnmanagedType.LPTStr)] public string title; public int flags; public IntPtr Callback; Public INTPTR LPARAM;
[DllImport ( "shell32.dll", CharSet = CharSet.Auto)] static extern IntPtr SHBrowseForFolder (ref BrowseInfo info); [DllImport ( "shell32.dll", CharSet = CharSet.Auto)] [return: MarshalAs (UnmanagedType.Bool )] INTERNAL EXTERN Static Bool ShgetPathFromidList (INTPTR PIDL, [Marshalas (unmanagedType.lptstr)] System.Text.StringBuilder Pszpath;
public static string BrowseFolder (IWin32Window owner) {BrowseInfo info = new BrowseInfo (); info.flags = (int) BrowseFlag.BIF_RETURNONLYFSDIRS (int) BrowseFlag.BIF_STATUSTEXT (int) BrowseFlag.BIF_VALIDATE; info.hwndOwner = owner.Handle; INTPTR PIDLRETURNED = SHBROWSEFORFOLDER (REF INFO);
Stringbuilder SB = New StringBuilder (260); SHGETPATHFROMIDLIST (PIDLRETURNED, SB);