예제 #1
0
        /// <summary>
        /// Shows the folder browser dialog 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)
            {
                Application.OleRequired( );
            }

            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      = descriptionText;
                bi.ulFlags        = mergedOptions;
                // Rest of the fields are initialized to zero by constructor
                // bi.lpfn = null;  bi.lParam = IntPtr.Zero;    bi.iImage = 0;

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

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

                if (pidlRet == IntPtr.Zero)
                {
                    // User pressed 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
                directoryPath = 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 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 )
            {
                Application.OleRequired ( );
            }

            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 = descriptionText;
                bi.ulFlags = mergedOptions;
                // Rest of the fields are initialized to zero by constructor
                // bi.lpfn = null;  bi.lParam = IntPtr.Zero;    bi.iImage = 0;

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

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

                if ( pidlRet == IntPtr.Zero )
                {
                    // User pressed 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
                directoryPath = sb.ToString ( );
            }
            finally
            {
                Win32API.IMalloc malloc = GetSHMalloc ( );
                malloc.Free ( pidlRoot );

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

            return DialogResult.OK;
        }