コード例 #1
0
            /// <summary>
            ///
            /// </summary>
            /// <param name="hwndOwner"></param>
            /// <returns></returns>
            protected override bool RunDialog(System.IntPtr hwndOwner)
            {
                IntPtr ptr1  = IntPtr.Zero;
                bool   flag1 = false;

                Win32API.SHGetSpecialFolderLocation(hwndOwner, (int)m_rootFolder, ref ptr1);
                if (ptr1 == IntPtr.Zero)
                {
                    Win32API.SHGetSpecialFolderLocation(hwndOwner, 0, ref ptr1);
                    if (ptr1 == IntPtr.Zero)
                    {
                        throw new Exception("FolderBrowserDialogNoRootFolder");
                    }
                }

                //Initialize the OLE to current thread.
                Application.OleRequired();
                IntPtr ptr2 = IntPtr.Zero;

                try
                {
                    Win32API.BROWSEINFO browseinfo1 = new Win32API.BROWSEINFO();
                    IntPtr ptr3 = Marshal.AllocHGlobal((int)(260 * Marshal.SystemDefaultCharSize));
                    IntPtr ptr4 = Marshal.AllocHGlobal((int)(260 * Marshal.SystemDefaultCharSize));
                    Win32API.BrowseCallbackProc proc1 = new Win32API.BrowseCallbackProc(this.FolderBrowserDialog_BrowseCallbackProc);
                    browseinfo1.pidlRoot       = ptr1;
                    browseinfo1.hwndOwner      = hwndOwner;
                    browseinfo1.pszDisplayName = ptr3;
                    browseinfo1.lpszTitle      = m_descriptionText;
                    browseinfo1.ulFlags        = 0x40;
                    browseinfo1.lpfn           = proc1;
                    browseinfo1.lParam         = IntPtr.Zero;
                    browseinfo1.iImage         = 0;
                    ptr2 = Win32API.SHBrowseForFolder(browseinfo1);

                    string s = Marshal.PtrToStringAuto(ptr3);

                    if (ptr2 != IntPtr.Zero)
                    {
                        Win32API.SHGetPathFromIDList(ptr2, ptr4);
                        this.m_selectedPath = Marshal.PtrToStringAuto(ptr4);
                        Marshal.FreeHGlobal(ptr4);
                        Marshal.FreeHGlobal(ptr3);
                        flag1 = true;
                    }
                }
                finally
                {
                    Win32API.IMalloc malloc1 = GetSHMalloc();
                    malloc1.Free(ptr1);
                    if (ptr2 != IntPtr.Zero)
                    {
                        malloc1.Free(ptr2);
                    }
                }
                return(flag1);
            }
コード例 #2
0
        protected override bool RunDialog(IntPtr hwndOwner)
        {
            var  pidlRoot = IntPtr.Zero;
            bool result   = false;

            Win32API.Shell32.SHGetSpecialFolderLocation(hwndOwner, (int)Environment.SpecialFolder.Desktop, ref pidlRoot);

            int ulFlags = Win32API.Params.BIF_NEWDIALOGSTYLE;

            if (!ShowNewFolderButton)
            {
                ulFlags += Win32API.Params.BIF_NONEWFOLDERBUTTON;
            }

            var pidl           = IntPtr.Zero;
            var pszDisplayName = IntPtr.Zero;
            var pszPath        = IntPtr.Zero;

            try
            {
                pszDisplayName = Marshal.AllocHGlobal(260 * Marshal.SystemDefaultCharSize);
                pszPath        = Marshal.AllocHGlobal(260 * Marshal.SystemDefaultCharSize);

                var lpbi = new Win32API.BROWSEINFO
                {
                    pidlRoot       = pidlRoot,
                    hwndOwner      = hwndOwner,
                    pszDisplayName = pszDisplayName,
                    lpszTitle      = Description + "",
                    ulFlags        = ulFlags,
                    lpfn           = new Win32API.BrowseCallbackProc(OnBrowseEvent),
                    lParam         = IntPtr.Zero,
                    iImage         = 0
                };

                pidl = Win32API.Shell32.SHBrowseForFolder(lpbi);

                if (pidl != IntPtr.Zero)
                {
                    Win32API.Shell32.SHGetPathFromIDList(pidl, pszPath);
                    _isCheckSelectedPath = true;
                    _selectedPath        = Marshal.PtrToStringAuto(pszPath);
                    result = true;
                }
            }
            finally
            {
                var malloc = GetSHMalloc();
                malloc.Free(pidlRoot);

                if (pidl != IntPtr.Zero)
                {
                    malloc.Free(pidl);
                }
                if (pszPath != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(pszPath);
                }
                if (pszDisplayName != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(pszDisplayName);
                }
            }

            return(result);
        }