我希望允许Windows游戏的用户使用对话框选择文件夹或文件。目前我可以使用SHBrowseForFolder或GetOpenFileName之一,但无法在同一个对话框中同时使用两个选项。这是否可能?(原因是我正在移植一个可以实现此功能的Mac游戏。)
我希望允许Windows游戏的用户使用对话框选择文件夹或文件。目前我可以使用SHBrowseForFolder或GetOpenFileName之一,但无法在同一个对话框中同时使用两个选项。这是否可能?(原因是我正在移植一个可以实现此功能的Mac游戏。)
我知道这个帖子很旧,但最近我遇到了同样的问题。 我发现当点击“确定”按钮时,对话框会发出CDN_FOLDERCHANGE消息,但实际上文件夹并没有改变(与上次调用相同)。 因此,我想出了以下挂钩过程:
UINT_PTR CALLBACK openfilename_cb (
HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
NMHDR *nmhdr;
OFNOTIFY *ofnotify;
static char dir_now[PATH_MAX], dir_prev[PATH_MAX];
do_debug (5, "openfilename_cb(): hwnd=%p, msg=%d\n", hwnd, msg);
switch (msg)
{
case WM_INITDIALOG:
do_debug (2, "openfilename_cb(): WM_INITDIALOG\n");
break;
case WM_NOTIFY:
ofnotify = (OFNOTIFY *)lParam;
nmhdr = &ofnotify->hdr;
do_debug (4,"openfilename_cb(): WM_NOTIFY, hwnd=%p, id=%d, code=%d\n",
nmhdr->hwndFrom, nmhdr->idFrom, nmhdr->code);
switch (nmhdr->code)
{
case CDN_INITDONE:
do_debug (3, "openfilename_cb(): CDN_INITDONE\n");
dir_prev[0] = '\0';
break;
case CDN_FILEOK:
do_debug (3, "openfilename_cb(): CDN_FILEOK\n");
break;
case CDN_FOLDERCHANGE:
do_debug (3, "openfilename_cb(): CDN_FOLDERCHANGE\n");
SendMessage (nmhdr->hwndFrom, CDM_GETFOLDERPATH, sizeof(dir_now),
(LPARAM)dir_now);
do_debug (3, " directory=%s\n", dir_now);
if (ofnotify->lpOFN->lCustData & FN_OPENDIR)
{
if (stricmp(dir_now, dir_prev) == 0)
{
/* user clicked the OK button */
strncpy (ofnotify->lpOFN->lpstrFile, dir_now, PATH_MAX);
ofnotify->lpOFN->lCustData = MAGIC;
PostMessage (nmhdr->hwndFrom, WM_COMMAND, IDCANCEL, 0);
do_debug (3, " closing dialog\n");
break;
}
strncpy (dir_prev, dir_now, sizeof(dir_prev));
}
break;
case CDN_HELP:
do_debug (3, "openfilename_cb(): CDN_HELP\n");
break;
case CDN_SELCHANGE:
do_debug (3, "openfilename_cb(): CDN_SELCHANGE\n");
break;
case CDN_SHAREVIOLATION:
do_debug (3, "openfilename_cb(): CDN_SHAREVIOLATION\n");
break;
case CDN_TYPECHANGE:
do_debug (3, "openfilename_cb(): CDN_TYPECHANGE\n");
break;
} /* switch (nmhdr->code) */
break; /* WM_NOTIFY */
} /* switch (msg) */
return 0;
}
确保在OPENFILENAME结构的Flags成员中设置OFN_ENABLEHOOK和OFN_EXPLORER位,以便调用钩子过程。当然,还要将lpfnHook成员设置为钩子函数的地址。
我发现使用钩子过程与否对话框的外观有很大不同(元素排序方式不同,在左窗格中有树形视图而不是大图标等等)。
你必须与调用函数来回通信,告诉它你想要/已经选择了一个目录。我使用OPENFILENAME结构的lCustData成员来实现这一点。
我在Windows 10版本19042.1052(64位)和Windows XP(32位)上进行了测试。
Johannes