Windows 使用GetSaveFileName。我指定了OFN_浏览器标志,但除非我避免同时使用钩子和模板,否则总是使用旧的对话框外观

Windows 使用GetSaveFileName。我指定了OFN_浏览器标志,但除非我避免同时使用钩子和模板,否则总是使用旧的对话框外观,windows,winapi,Windows,Winapi,使用GetSaveFileName。我指定了OFN_浏览器标志,但我总是使用旧的对话框外观,除非我避免同时使用钩子和模板。(OPENFILENAME结构中的lpfnHook和lpfnTemplate(及其各自的“启用”标志) 如果我避免只使用其中一个,我仍然会得到旧的对话框外观。我也尝试了没有模板,但使用挂钩。。。但是总是从它返回TRUE(我看到从钩子中提到“总是返回false”是获取旧接口的一种方式)。不过,这似乎没有任何效果 编辑:添加相关代码: ofn.lStructSize=sizeof

使用GetSaveFileName。我指定了OFN_浏览器标志,但我总是使用旧的对话框外观,除非我避免同时使用钩子和模板。(OPENFILENAME结构中的lpfnHook和lpfnTemplate(及其各自的“启用”标志)

如果我避免只使用其中一个,我仍然会得到旧的对话框外观。我也尝试了没有模板,但使用挂钩。。。但是总是从它返回TRUE(我看到从钩子中提到“总是返回false”是获取旧接口的一种方式)。不过,这似乎没有任何效果

编辑:添加相关代码:

ofn.lStructSize=sizeof(OPENFILENAME);
ofn.hInstance=RhInst;
ofn.hwndOwner=MainWh;
ofn.lpstrFilter=s;
ofn.lpstrCustomFilter=null;
ofn.nMaxCustFilter=0;
ofn.nFilterIndex=sel;

ofn.lpstrFile=fname;
ofn.nMaxFile=lstrl;
ofn.lpstrFileTitle=tfile;
ofn.nMaxFileTitle=lstrl;

if (path && lstrlen(path)) ofn.lpstrInitialDir=path;
else ofn.lpstrInitialDir=drive;

lstrcpy(SE_DefExt,ext);
ofn.lpstrDefExt=SE_DefExt;
if (titleid) ofn.lpstrTitle=title;
else ofn.lpstrTitle=null;

ofn.lpfnHook=(CommHookProc)MakeProcInstance((FARPROC)SEOpen32Hook,hInst);
ofn.lpTemplateName=NULL;
ofn.Flags=OFN_SHOWHELP | OFN_OVERWRITEPROMPT | OFN_ENABLEHOOK  | OFN_EXPLORER
            | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;

if(allowfit)
    {
    ofn.lpTemplateName = MAKEINTRESOURCE(SAVETOFIT);
    ofn.Flags |= OFN_ENABLETEMPLATE;
    }

if (GetSaveFileName(&ofn))
    {
    // <snip>
    }
ofn.lsstructsize=sizeof(OPENFILENAME); ofn.hInstance=莱茵斯特; of n.hwnowner=MainWh; ofn.lpstrFilter=s; ofn.lpstrCustomFilter=null; ofn.nMaxCustFilter=0; ofn.nFilterIndex=sel; ofn.lpstrFile=fname; ofn.nMaxFile=lstrl; ofn.lpstrFileTitle=tfile; ofn.nMaxFileTitle=lstrl; 如果n.lpstrInitialDir的(path&&lstrlen(path))为path; else of n.lpstrInitialDir=驱动器; lstrcpy(seu deext,ext); ofn.lpstrDefExt=SE_deext; if(titleid)of n.lpstrtite=标题; else of n.lpstrtite=null; ofn.lpfnHook=(CommHookProc)MakeProcInstance((FARPROC)SEOpen32Hook,hInst); ofn.lpTemplateName=NULL; ofn.Flags=ofn_SHOWHELP | ofn_OVERWRITEPROMPT | ofn_ENABLEHOOK | ofn_EXPLORER |n|u路径必须存在,n|u路径必须隐藏; 如果(允许) { ofn.lpTemplateName=MAKEINTRESOURCE(SAVETOFIT); ofn.Flags |=ofn_启用模板; } if(GetSaveFileName(&ofn)) { // } 请注意,在这种情况下,“allowfit”是非零/真的。如果我注释掉OFN_ENABLEHOOK和OFN_ENABLETEMPLATE的标志设置,就会得到“新建”对话框外观

**编辑2:
现在看来我对我所看到的东西感到困惑。我相信在这两种情况下,我得到了“新”的N_探险家的行为和外观。当我删除OFN_EXPLORER标志时,会出现一个非常老式的对话框


我想了解的是“保存文件”对话框的样式,它在右上角有“后退”和“前进”按钮,最重要的是,还有一个我可以输入的地址框。我之前的所有评论和代码描述(以上)仍然适用;当我移除模板和钩子时,我会得到我的“后退和前进”按钮,以及我的可键入地址框(加上左侧的浏览树)。。。当我保留模板和钩子时——我没有(而是在顶部有“Save in”选取列表,在左侧有“standard places”(“最近的位置”、“桌面”和…)。

也许您需要显示一些代码?根据MSDN:

您可以提供一个hook proc钩子 资源管理器样式保存的过程 对话框。要启用挂钩 过程中,设置OFN_资源管理器和 标志中的OFN_ENABLEHOOK标志 OPENFILENAME结构的成员 并指定钩子的地址 lpfnHook成员中的过程


因此,除非您正在做一些奇怪的事情,否则它应该会工作。

至于模板,您应该定义DS_SHELLFONT。
您是否定义了
\u WIN32\u WINNT>=0x0500

将lStructSize设置为win2000大小可能有助于对话框做出决定(如果需要支持OPENFILENAME\u size\u version\u 400作为底层系统的大小)

如果在Windows Vista和7中同时使用
of n_EXPLORER
of n_ENABLEHOOK
,您将获得XP风格的对话框。如果删除
of n_EXPLORER
您将获得旧的Win2k风格。如果使用
of n_ENABLEHOOK
(或
of n_enablemplate
)然后系统将不使用Vista/7样式

由于Vista,如果您想自定义此类对话框,建议您使用COM接口
IFileDialog
IFileOpenDialog
,以及
IFileSaveDialog
。请参见。

参见上面的我的“编辑2”。看起来我不是在对抗“旧外观/新外观”正如OFN_EXPLORER设置的,我正在与一些浏览器/非浏览器行为和外观进行斗争。知道我可能需要做什么吗?遗憾的是,我不能只删除模板和挂钩;这些必须保留。