フォームがあり、画面の中央ではなく、フォームの上に配置されているフォルダー ブラウザー ダイアログを開こうとしています。(Windows 7、Visual Studio Express 2012)
フォーム名は「フォーム」
FolderBrowserDialog で次のことを試しました。
browseFolderDialog = gcnew FolderBrowserDialog();
DialogResult result = browseFolderDialog->ShowDialog(form);
また、フォームのハンドルを hwnd として提供する SHBrowseForFolder を使用してみました。
System::String^ BrowseUtility::getFolder(System::Windows::Forms::Form^ form)
{
//HWND hwnd = GetForegroundWindow();
System::Windows::Forms::Control ^ctrl1 = form; // Form derives from Control
System::IntPtr wrappedHandle = form->Handle;
void *windowHandle1 = wrappedHandle.ToPointer();
HWND hwnd = reinterpret_cast<HWND>(windowHandle1);
System::String^ result = L"-1";
TCHAR szFolder[MAX_PATH];
if (GetFolderSelection(hwnd, szFolder, TEXT("Please select a folder.")))
{
result = gcnew System::String(szFolder);
}
return result;
}
BOOL BrowseUtility::GetFolderSelection(HWND hWnd, LPTSTR szBuf, LPCTSTR szTitle)
{
LPITEMIDLIST pidl = NULL;
BROWSEINFO bi = { 0 };
BOOL bResult = FALSE;
bi.hwndOwner = hWnd;
bi.pszDisplayName = szBuf;
bi.pidlRoot = NULL;
bi.lpszTitle = szTitle;
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
if ((pidl = SHBrowseForFolder(&bi)) != NULL)
{
bResult = SHGetPathFromIDList(pidl, szBuf);
CoTaskMemFree(pidl);
}
return bResult;
}
hWnd を HWND hwnd = GetForegroundWindow(); として提供しようとしたことにも注意してください。
フォルダ ブラウザは引き続き画面の中央に表示されます。
どんなアイデアでも役に立ちます-これはそれほど難しいことではありません