private int OnBrowseEvent(IntPtr hWnd, int msg, IntPtr lp, IntPtr lpData) { switch (msg) { case WindowsInterop.BFFM_INITIALIZED: // Required to set initialPath { //Win32.SendMessage(new HandleRef(null, hWnd), BFFM_SETSELECTIONA, 1, lpData); // Use BFFM_SETSELECTIONW if passing a Unicode string, i.e. native CLR Strings. if (!string.IsNullOrEmpty(_initialPath)) { WindowsInterop.SendMessage(new HandleRef(null, hWnd), WindowsInterop.BFFM_SETSELECTIONW, 1, _initialPath); } break; } case WindowsInterop.BFFM_SELCHANGED: { var pathPtr = Marshal.AllocHGlobal(260 * Marshal.SystemDefaultCharSize); if (WindowsInterop.SHGetPathFromIDList(lp, pathPtr)) { WindowsInterop.SendMessage(new HandleRef(null, hWnd), WindowsInterop.BFFM_SETSTATUSTEXTW, 0, pathPtr); } Marshal.FreeHGlobal(pathPtr); break; } } return(0); }
private DialogResponse SelectFolderInternal(string message, FileDialogOptions options) { if (Directory.Exists(options.Directory)) { _initialPath = options.Directory; } var pIdList = IntPtr.Zero; var sb = new StringBuilder(256); var bufferAddress = Marshal.AllocHGlobal(256); var bi = new WindowsInterop.BROWSEINFO { hwndOwner = IntPtr.Zero, pidlRoot = IntPtr.Zero, pszDisplayName = message, lpszTitle = options.Title, ulFlags = WindowsInterop.BIF_NEWDIALOGSTYLE | WindowsInterop.BIF_SHAREABLE, lpfn = OnBrowseEvent, lParam = IntPtr.Zero, iImage = 0 }; try { pIdList = WindowsInterop.SHBrowseForFolder(ref bi); if (pIdList == IntPtr.Zero) { return(new DialogResponse { IsCanceled = true }); } if (true != WindowsInterop.SHGetPathFromIDList(pIdList, bufferAddress)) { return(new DialogResponse { Value = string.Empty }); } sb.Append(Marshal.PtrToStringAuto(bufferAddress)); } finally { // Caller is responsible for freeing this memory. Marshal.FreeCoTaskMem(pIdList); } return(new DialogResponse { Value = sb.ToString() }); }