GetOpenFileName 可以将文件选择限制为与过滤器匹配的文件吗?

Posted

技术标签:

【中文标题】GetOpenFileName 可以将文件选择限制为与过滤器匹配的文件吗?【英文标题】:Can GetOpenFileName limit the file selection to files that match the filter? 【发布时间】:2017-05-01 20:02:05 【问题描述】:

我正在使用带有 OPENFILENAME 结构的 GetOpenFileName,该结构使用 lpstrFilter 将文件过滤为 *.JPG。但是,在文件打开对话框中,对于文件名,用户可以输入 *.XLS 并查看同一文件夹中的每个 Excel 文件并选择打开 XLS 文件。我想阻止用户这样做。例如,我真的想将它们限制为只能选择 JPG 文件。有没有办法做到这一点?

【问题讨论】:

我认为没有办法;但即使有,也不会阻止用户将 xls 文件重命名为 jpg。或者打开在不稳定的连接上下载或保存在损坏的 USB 密钥上的损坏的 jpeg。过滤器列表只是帮助用户选择“正确”文件的便利,如果他想喂你的应用程序垃圾,总有办法。最终,您总是需要有代码来优雅地处理这样一个事实,即提供给您的文件实际上并不是您所期望的。 感谢@MatteoItalia 【参考方案1】:

OPENFILENAME 结构中,启用OFN_EXPLOREROFN_ENABLEHOOK 标志,并在lpfnHook 字段中提供指向Explorer-style callback function 的指针。当回调收到CDN_FILEOK 通知时,您可以验证输入的文件(不仅仅是文件名,甚至是实际文件内容,如果需要),然后返回适当的返回值以接受/拒绝选择:

如果挂钩过程返回零,则对话框接受指定的文件名并关闭。

要拒绝指定的文件名并强制对话框保持打开状态,请从挂钩过程中返回一个非零值并调用SetWindowLong 函数来设置一个非零DWL_MSGRESULT 值。

【讨论】:

您还需要OFN_ENABLEHOOK 标志,否则lpfnHook 将被忽略。

以上是关于GetOpenFileName 可以将文件选择限制为与过滤器匹配的文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

GetOpenFileName 选择文件夹的解决方法

OFN_ALLOWMULTISELECT 时 Windows API 函数 GetOpenFileName() 的字符限制是不是有解决方法?

关于GetOpenFileName和GetSaveFileName的问题

getOpenFileName 上的进度条

从 Access for Excel GetOpenFileName 设置默认文件路径

在“Application.GetOpenFilename”中单击退出或取消时出现错误消息