private bool ShowDialog(IntPtr owner) { IFileOpenDialog fod = null; try { fod = new FileOpenDialog() as IFileOpenDialog; fod.SetOptions(FOS.FOS_PICKFOLDERS | FOS.FOS_FORCEFILESYSTEM); if (!string.IsNullOrEmpty(InitialPath)) { uint attribute = 0U; if ((SHILCreateFromPath(InitialPath, out IntPtr idl, ref attribute) == S_OK) && (SHCreateShellItem(IntPtr.Zero, IntPtr.Zero, idl, out IShellItem item) == S_OK)) { fod.SetFolder(item); } } if (!string.IsNullOrEmpty(Title)) { fod.SetTitle(Title); } if (fod.Show(owner) != S_OK) { return(false); } SelectedPath = fod.GetResult().GetDisplayName(SIGDN.SIGDN_FILESYSPATH); return(true); } catch (COMException ce) { Debug.WriteLine($"Failed to manage open folder dialog.\r\n{ce}"); return(false); } finally { if (fod is not null) { Marshal.FinalReleaseComObject(fod); } } }
public bool ShowDialog(IntPtr ownerWindow) { // オーナーウィンドウを正規化する ownerWindow = GetSafeOwnerWindow(ownerWindow); // ダイアログインターフェースを構築 IFileOpenDialog dlg = new FileOpenDialog() as IFileOpenDialog; // IUnknown::QueryInterfaceを使ってインターフェースを特定する try { // フォルダ選択モードに切り替え dlg.SetOptions(FOS.FORCEFILESYSTEM | FOS.PICKFOLDERS); // 以前選択されていたフォルダを指定 bool setFolder = false; IShellItem item = CreateItem(SelectedPath); if (item != null) { dlg.SetFolder(item); Marshal.ReleaseComObject(item); setFolder = true; } // まだフォルダを設定していない場合は初期フォルダを設定する if (!setFolder) { item = CreateItem(InitialFolder); if (item != null) { dlg.SetFolder(item); Marshal.ReleaseComObject(item); } } // タイトル if (!string.IsNullOrWhiteSpace(Title)) { dlg.SetTitle(Title); } // ショートカット追加 foreach (var place in m_places) { item = CreateItem(place.folder); if (item != null) { dlg.AddPlace(item, place.fdap); Marshal.ReleaseComObject(item); } } // ダイアログを表示 var hRes = dlg.Show(ownerWindow); if (NativeMethods.SUCCEEDED(hRes)) { item = dlg.GetResult(); SelectedPath = item.GetName(SIGDN.FILESYSPATH); Marshal.ReleaseComObject(item); return(true); } } finally { Marshal.ReleaseComObject(dlg); } return(false); }