使用GetOpenFileName限制目录()

时间:2012-11-18 19:21:08

标签: c++ visual-studio-2010 winapi

我知道Microsoft建议使用GetOpenFileName()GetSaveFileName()上的Common Item对话框,但我正在处理一些旧代码。

如何限制GetOpenFileName()仅允许用户选择某个目录中的文件?

例如,我只希望用户能够从“Images”目录中选择一个文件。我不希望他们在打开文件时能够导航到其他目录。他们必须从“Images”目录中选择一个文件。

标志 OFN_NOCHANGEDIR 听起来像是我需要的,但如果用户在打开文件时更改它,则只会将当前目录更改回原始目录。

如果使用GetOpenFileName()无法实现,是否可以使用较新的Common Item Dialog?

1 个答案:

答案 0 :(得分:2)

对于GetOpenFileName()GetSaveFileName(),您可以为OPENFILENAME::lpfnHook字段分配回调程序。收到CDN_FILEOK通知后,通过向对话框发送CDM_GETFOLDERPATH消息来检索所选文件夹。如果您不接受该文件夹,请向用户显示一条消息,然后通过调用SetWindowLong()来设置非零DWL_MSGRESULT值来拒绝所选文件,并从钩子返回非零值过程

更新:对于IFileOpenDialogIFileSaveDialog,您可以实施IFileDialogEvents::OnFolderChanging事件回调,以防止导航到不需要的文件夹,只需返回错误{{ 1}}除HRESULTS_OK以外的值。