1

現在、フォルダーの参照ウィンドウを開くために使用していますが、キャンセル/ OKを押したSHBrowseForFolder()ときにメイン ウィンドウにフォーカスを戻すにはどうすればよいですか。ダイアログを閉じる前にメインウィンドウを再度有効にする必要があると読みましたが、それは正確にはどこですか? 何かご意見は?

void buttonPush(HWND hWnd) {
    EnableWindow(hWnd, FALSE);
    BROWSEINFO bi = { 0 };
    TCHAR szDir[MAX_PATH] = { 0 };
    LPITEMIDLIST pid = NULL;
    LPMALLOC pMalloc = NULL;

    if (SUCCEEDED(SHGetMalloc(&pMalloc)))
    {
        ZeroMemory(&bi,sizeof(bi));
        bi.hwndOwner = NULL;
        bi.pszDisplayName = NULL;
        bi.pidlRoot = NULL;
        bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_USENEWUI;
        bi.lpfn = BrowseCallbackProc;

        pidl = SHBrowseForFolder(&bi); 
        if (pidl) 
        { 
            // Folder selected in dialog
            pMalloc->Free(pidl); 
        } 
        pMalloc->Release();
    }
    EnableWindow(hWnd, TRUE);
}
4

2 に答える 2

7

メインウィンドウを有効または無効にする代わりに、設定するだけで、bi.hwndOwner = hWnd;自動的に有効および無効になります。

于 2013-01-05T17:43:17.397 に答える
5
  EnableWindow(hWnd, false);

あなたが助けすぎているので、これはうまくいきません。ダイアログが閉じると、アプリケーションにはまだフォーカスを受け取ることができるウィンドウが残っていません。あなたの hWnd はまだ無効になっており、後で有効になりません。そのため、Windows ウィンドウ マネージャーは、フォーカスを与える別のウィンドウを探す必要があります。それは別のアプリのウィンドウになります。必然的にあなたのウィンドウはその背後に消えます.

EnableWindow() 呼び出しを削除します。これで十分ですが、ダイアログにウィンドウについて伝えることができるので、推測する必要がなくなります。ウィンドウが何らかの理由でアクティブなウィンドウではない場合に役立ちます。

  bi.hwndOwner = hWnd;
于 2013-01-05T17:51:23.670 に答える