【问题标题】:How to detect that file dialog has been created using GetOpenFileName?如何检测已使用 GetOpenFileName 创建的文件对话框?
【发布时间】:2011-09-02 16:06:08
【问题描述】:

我参与了命名空间外壳扩展(NSE)的开发,其中包含来自某些文件夹的文件列表。我在 Window Vista 上使用标志 OFN_ALLOWMULTISELECT 创建的打开文件对话框 (OFD) 存在一些问题。

如果应用程序使用使用IFileOpenDialog 创建的 OFD,我的 NSE 工作正常。 如果应用程序使用使用GetOpenFileName 创建的 OFD 并且用户选择了一些文件,那么他会得到不正确的结果,因为此函数返回字符串:

<Folder name>\0<File name 1>\0<File name2>\0\0

如果应用程序使用使用GetOpenFileName 创建的 OFD,我必须在 NSE 中使用单选模式。

问题是:

有什么方法可以在我的 NSE 中检测到 OFD 是使用 GetOpenFileName 创建的吗?

【问题讨论】:

  • 您无法检测到这一点。听起来好像您想更改文件对话框的行为而不是修复 NSE 中的错误。人们编写软件时使用多选文件对话框,因为他们想要选择多个文件。试图阻止对用户异常不利的内容。
  • 我已经在我的 NSE 和 Windows 搜索结果中测试了使用 GetOpenFileName 创建的 OFD,并得到了相同的错误。我认为,我的 NSE 返回了正确的数据,但 GetOpenFileName 无法处理它,也无法将正确的文件名(带有子文件夹)放入结果字符串中。我不想更改 OFD 的行为,但如果它返回不正确的文件名,用户将收到错误“找不到文件”。我可以使用下一个方法:尝试从 IShellBrowser 获取 IFileOpenDialog,如果此尝试成功,则使用 IFileOpenDialog 创建 OFD,否则使用 GetOpenFileName。但我不确定这是否可能。
  • 这不是一个错误的结果,这就是 windows OFD 分隔多个选定文件的方式。
  • 必须有如下结果:\0\0\0\0\0\0。使用 IFileOpenDialog 创建的 OFD 在 IShellItemArray 中返回正确的结果

标签: c++ visual-c++ windows-vista getopenfilename


【解决方案1】:

旧的 GetOpenFileName 对话框从未设计用于处理不同父文件夹中的多个文件。

尝试通过检测使用的打开对话框的类型来解决此问题是错误的,GetOpenFileName 可能只是新界面顶部的包装器。

当您的 IShellFolder::EnumObjects 方法被调用时,查找 SHCONTF_FLATLIST 标志。如果未设置标志,那么您应该恢复到某种类型的简单模式,其中所有项目都具有相同的父项。我意识到这并不完全是标志的用途,但它可能是最好的非 hacky 解决方案。

【讨论】:

    猜你喜欢
    • 2015-11-30
    • 2013-07-19
    • 1970-01-01
    • 2016-12-25
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多