在通用文件对话框中获取当前所选文件的真实名称?

可以在通用对话框的列表视图中获取所选项目的文本。 但是不能得到它的PIDL,如果用户select隐藏已知的扩展名(缺省值),那么不能确定没有扩展名或PIDL的文件被选中。

所以解决这个问题的可能方法可能是:

  1. 从标准的打开文件对话框中获取一个IShellView。 底层的IShellView可以告诉当前select的PIDL是什么。 所以,如果我能简单地了解IShellView,那我就是金手镯。 不幸的是,我看不到有CDM_xxx这样做。 我无法想象任何可能实现的目标! 🙁
  2. 其他一些想法?

我们曾经依赖于Windows 9x,2000和XP版本的通用文件对话框在LVITEM数据中存储每个项目的PIDL(保留DiLascia的原始信用):

LPCITEMIDLIST pidlItem =(LPCITEMIDLIST)pListCtrl-> GetItemData(nItem);

但是,从Vista的通用控制和以上开始,该技术失败:(

有什么想法吗?

编辑:我需要能够不仅获得列表视图中当前选定的项目,而且列表视图中的所有项目的这些信息。

编辑2:我需要深入挖掘的原因:

在我们的应用程序的以前版本中,我们提供了以下function:(1)按下一个自定义button“预览”,closures对话框,但将视图中当前显示的项目列表以可见的顺序传送给应用程序当前突出显示的索引。 这个列表必须完全指定 – 看到3个文件都是“J1329192”(当真正有3个文件“J1329192.xyz”“J1329192.xzy”和“J1329192.zyx”时,这个文件没有用处。

用户可以在“文件名:”字段中input部分文件名filter,并且通用对话框将按用户select的sorting顺序仅显示与给定的部分filter相匹配的文件。 所以要向应用程序准确报告用户想要预览的内容,需要我们能够从列表视图控件(或通用对话框本身)查询这些信息。

我们还对文件对话框进行了其他改进 – 包括一个就地预览窗格,将用户的当前select显示为缩略图,还有一个自定义的最近位置的界面等等。所有这些都是可能的的工作)在Vista之前。 后Vista,我已经跑到墙上的墙上。 目前,我们使用一个标准的文件对话框,只有我们自己的很less的function,这不适合客户(发生了什么functionX ?!)

还有其他的改进,但这是一个很好的概述。 他们都归结为要求知道“真的,老实说,在索引X的视图中具体是什么文件? 而由于未知的原因,微软似乎并不觉得需要提供这样的接口。 其实他们从来没有这样做过 只有通过一些黑客攻击和逆向工程,我们才能够弄清楚事情是如何运行的,并获得所需的信息。 是的,这是不支持的,是的,MS不可避免地打破了我们的代码。 我并不真正责怪他们 – 我所发现的令人讨厌的是,他们新的,更加炫丽的界面比他们更老的界面更加封闭 – 而且他们没有提供更多的前期界面 – 支持的界面 – 进行这些对话增强。 就像他们向后退了几步,没有一个(以进步的名义)。

发送WM_USER + 7来获取浏览器,然后获取其活动shell视图的IShellView接口。

你知道使用无证行为的正常结果吗?

啊,我找到了。 你会想要使用Vista的IFileOpenDialog ,它应该明确支持你所提到的所有操作。

我知道这是一个古老的线程,但在Vista +中,仍然支持旧式的对话框。 您可以关闭Vista风格,并像以前一样保留所有的自定义控件。 这就是我们所做的:我们有一个模板挂钩到CFileDialog的自定义预览窗口,这似乎是不可能在IFileDialog中重现。

我相信你需要在构造函数的BOOL参数中传递FALSE来关闭Vista风格的对话框。