/// <summary>
        /// Shows the folder browser dialog box with the specified owner window.
        /// </summary>
        public DialogResult ShowDialog(IWin32Window owner)
        {
            IntPtr pidlRoot = IntPtr.Zero;

            // Get/find an owner HWND for this dialog.
            IntPtr hWndOwner;

            if (owner != null)
            {
                hWndOwner = owner.Handle;
            }
            else
            {
                hWndOwner = Win32API.GetActiveWindow();
            }

            // Get the IDL for the specific startLocation.
            Win32API.Shell32.SHGetSpecialFolderLocation(hWndOwner, (int)startLocation, out pidlRoot);

            if (pidlRoot == IntPtr.Zero)
            {
                return(DialogResult.Cancel);
            }

            int mergedOptions = (int)publicOptions | (int)privateOptions;

            if ((mergedOptions & (int)Win32API.Shell32.BffStyles.NewDialogStyle) != 0)
            {
                if (System.Threading.ApartmentState.MTA == Application.OleRequired())
                {
                    mergedOptions = mergedOptions & (~(int)Win32API.Shell32.BffStyles.NewDialogStyle);
                }
            }

            IntPtr pidlRet = IntPtr.Zero;

            try
            {
                // Construct a BROWSEINFO.
                Win32API.Shell32.BROWSEINFO bi = new Win32API.Shell32.BROWSEINFO();
                IntPtr buffer = Marshal.AllocHGlobal(MAX_PATH);

                bi.pidlRoot       = pidlRoot;
                bi.hwndOwner      = hWndOwner;
                bi.pszDisplayName = buffer;
                bi.lpszTitle      = Description;
                bi.ulFlags        = mergedOptions;
                bi.lpfn           = new Win32API.Shell32.BFFCALLBACK(callback);
                // The rest of the fields are initialized to zero by the constructor.
                // bi.lParam = IntPtr.Zero;    bi.iImage = 0;

                // Show the dialog.
                pidlRet = Win32API.Shell32.SHBrowseForFolder(ref bi);

                // Free the buffer you've allocated on the global heap.
                Marshal.FreeHGlobal(buffer);

                if (pidlRet == IntPtr.Zero)
                {
                    // User clicked Cancel.
                    return(DialogResult.Cancel);
                }

                // Then retrieve the path from the IDList.
                StringBuilder sb = new StringBuilder(MAX_PATH);
                if (0 == Win32API.Shell32.SHGetPathFromIDList(pidlRet, sb))
                {
                    return(DialogResult.Cancel);
                }

                // Convert to a string.
                SelectedPath = sb.ToString();
            }
            finally
            {
                Win32API.IMalloc malloc = GetSHMalloc();
                malloc.Free(pidlRoot);

                if (pidlRet != IntPtr.Zero)
                {
                    malloc.Free(pidlRet);
                }
            }

            return(DialogResult.OK);
        }
Пример #2
0
		/// <summary>
		/// Shows the folder browser dialog box with the specified owner window.
		/// </summary>
		public DialogResult ShowDialog(IWin32Window owner)
		{
			IntPtr pidlRoot = IntPtr.Zero;

			// Get/find an owner HWND for this dialog.
			IntPtr hWndOwner;

			if (owner != null)
			{
				hWndOwner = owner.Handle;
			}
			else
			{
				hWndOwner = Win32API.GetActiveWindow();
			}

			// Get the IDL for the specific startLocation.
			Win32API.Shell32.SHGetSpecialFolderLocation(hWndOwner, (int) startLocation, out pidlRoot);

			if (pidlRoot == IntPtr.Zero)
			{
				return DialogResult.Cancel;
			}

			int mergedOptions = (int) publicOptions | (int) privateOptions;

			if ((mergedOptions & (int) Win32API.Shell32.BffStyles.NewDialogStyle) != 0)
			{
				if (System.Threading.ApartmentState.MTA == Application.OleRequired())
					mergedOptions = mergedOptions & (~(int) Win32API.Shell32.BffStyles.NewDialogStyle);
			}

			IntPtr pidlRet = IntPtr.Zero;

			try
			{
				// Construct a BROWSEINFO.
				Win32API.Shell32.BROWSEINFO bi = new Win32API.Shell32.BROWSEINFO();
				IntPtr buffer = Marshal.AllocHGlobal(MAX_PATH);

				bi.pidlRoot = pidlRoot;
				bi.hwndOwner = hWndOwner;
				bi.pszDisplayName = buffer;
				bi.lpszTitle = Description;
				bi.ulFlags = mergedOptions;
				bi.lpfn = new Win32API.Shell32.BFFCALLBACK(callback);
				// The rest of the fields are initialized to zero by the constructor.
				// bi.lParam = IntPtr.Zero;    bi.iImage = 0;

				// Show the dialog.
				pidlRet = Win32API.Shell32.SHBrowseForFolder(ref bi);

				// Free the buffer you've allocated on the global heap.
				Marshal.FreeHGlobal(buffer);

				if (pidlRet == IntPtr.Zero)
				{
					// User clicked Cancel.
					return DialogResult.Cancel;
				}

				// Then retrieve the path from the IDList.
				StringBuilder sb = new StringBuilder(MAX_PATH);
				if (0 == Win32API.Shell32.SHGetPathFromIDList(pidlRet, sb))
				{
					return DialogResult.Cancel;
				}

				// Convert to a string.
				SelectedPath = sb.ToString();
			}
			finally
			{
				Win32API.IMalloc malloc = GetSHMalloc();
				malloc.Free(pidlRoot);

				if (pidlRet != IntPtr.Zero)
				{
					malloc.Free(pidlRet);
				}
			}

			return DialogResult.OK;
		}