强制SHBrowseForFolder()显示所需的目录

时间:2013-07-04 13:38:25

标签: c++ winapi dialog directory

我一直在网上搜索这个东西超过一个小时,但似乎仍无法让它发挥作用。大多数人似乎都满意,当他们在论坛等上得到它时,但我仍然无法工作。 我正在尝试强制SHBrowseForFolder()函数在我选择的文件夹中启动。

char current[MAX_PATH];
strcpy(current,"C:\\Users");

char outbuf[MAX_PATH];
BROWSEINFO bis;
bis.hwndOwner = NULL;
bis.pidlRoot = NULL;
bis.pszDisplayName = outbuf;
bis.lpszTitle = (LPCSTR)"HERE";
bis.ulFlags = BIF_NEWDIALOGSTYLE|BIF_RETURNONLYFSDIRS;
bis.lpfn = NULL;
bis.lParam = (LPARAM)current;

SHBrowseForFolder(
    &bis
);

看起来这应该是一项相对简单的任务。 :/ 目前,上面的代码仍显示默认值:Desktop文件夹。 除了在特定文件夹中启动之外,如果可能的话,我还希望它只显示该文件夹及其下方,无法访问父目录。

我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

您还可以从BFFM_SETSELECTION发送BrowseCallbackProc条消息,例如:

int FAR PASCAL BrowseNotify(HWND hWnd, UINT iMessage, long wParam, LPARAM lParam)
{   if (iMessage == BFFM_INITIALIZED)
    {   SendMessage(hWnd, BFFM_SETSELECTION, 1, (LPARAM) szInitialPathName);    // Set initial folder
        return 1;
    }
    return 0;
}

答案 1 :(得分:2)

BFFCALLBACK(lpfn)设置为BrowseCallbackProc。在那里,您可以使用SendMessage调用BFFM_SETEXPANDED来指定要在“浏览”对话框中展开的文件夹的路径。

请参阅: http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205(v=vs.85).aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/bb762598(v=vs.85).aspx

根据我的经验,该文件夹对话框有点不稳定 - 它通常会将所需目录滚动到视图之外并且看起来不是最理想的。只是Windows的一个乐趣......

此外,我没有办法让它只显示该目录及其子目录。父目录似乎总是存在。

答案 2 :(得分:0)

将BIF.PidlRoot设置为您不希望用户在下面浏览的PIDL,选择并展开您想要最初聚焦和选择的文件夹 - 如上所述 - 它应该有效。

延。 :)