1

我目前正在使用打开浏览文件夹窗口,但是当按下取消/确定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 回答