示例#1
0
        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);
        }
示例#2
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()
            });
        }