private int FolderBrowserCallback(IntPtr hwnd, int msg, IntPtr lParam, IntPtr lpData)
{
switch (msg)
{
case BrowseForFolderMessages.BFFM_INITIALIZED:
if (this._selectedPath.Length != 0)
{
PInvoke.User32.SendMessage(new HandleRef(null, hwnd), BrowseForFolderMessages.BFFM_SETSELECTIONW, 1, this._selectedPath);
if (this._showEditBox && this._showFullPathInEditBox)
{
// get handle to the Edit box inside the Folder Browser Dialog
_hwndEdit = PInvoke.User32.FindWindowEx(new HandleRef(null, hwnd), IntPtr.Zero, "Edit", null);
PInvoke.User32.SetWindowText(_hwndEdit, this._selectedPath);
}
}
break;
case BrowseForFolderMessages.BFFM_SELCHANGED:
IntPtr pidl = lParam;
if (pidl != IntPtr.Zero)
{
if (((_uiFlags & BrowseFlags.BIF_BROWSEFORPRINTER) == BrowseFlags.BIF_BROWSEFORPRINTER) ||
((_uiFlags & BrowseFlags.BIF_BROWSEFORCOMPUTER) == BrowseFlags.BIF_BROWSEFORCOMPUTER))
{
// we're browsing for a printer or computer, enable the OK button unconditionally.
PInvoke.User32.SendMessage(new HandleRef(null, hwnd), BrowseForFolderMessages.BFFM_ENABLEOK, 0, 1);
}
else
{
IntPtr pszPath = Marshal.AllocHGlobal(MAX_PATH * Marshal.SystemDefaultCharSize);
bool haveValidPath = PInvoke.Shell32.SHGetPathFromIDList(pidl, pszPath);
String displayedPath = Marshal.PtrToStringAuto(pszPath);
Marshal.FreeHGlobal(pszPath);
// whether to enable the OK button or not. (if file is valid)
PInvoke.User32.SendMessage(new HandleRef(null, hwnd), BrowseForFolderMessages.BFFM_ENABLEOK, 0, haveValidPath ? 1 : 0);
// Maybe set the Edit Box text to the Full Folder path
if (haveValidPath && !String.IsNullOrEmpty(displayedPath))
{
if (_showEditBox && _showFullPathInEditBox)
{
if (_hwndEdit != IntPtr.Zero)
PInvoke.User32.SetWindowText(_hwndEdit, displayedPath);
}
if ((_uiFlags & BrowseFlags.BIF_STATUSTEXT) == BrowseFlags.BIF_STATUSTEXT)
PInvoke.User32.SendMessage(new HandleRef(null, hwnd), BrowseForFolderMessages.BFFM_SETSTATUSTEXT, 0, displayedPath);
}
}
}
break;
}
return 0;
}