可以在通用对话框的列表视图中获取所选项目的文本。但是无法获得它的 PIDL,如果用户选择隐藏已知扩展名(默认),那么如果没有扩展名或 PIDL,就无法真正判断选择了哪个文件。
所以解决这个问题的可能方法是:
- 从标准打开文件对话框中获取 IShellView。底层 IShellView 可以告诉当前选择的 PIDL 是什么。因此,如果我可以简单地获得 IShellView,我会很高兴。不幸的是,我看不到 CDM_xxx 会这样做。而且我无法想到任何可能实现它的东西!:(
- 还有什么想法?!
我们过去依赖于这样一个事实,即 Windows 9x、2000 和 XP 版本的通用文件对话框将每个项目的 PIDL 存储在 LVITEM 数据中(最初归功于 Paul DiLascia):
LPCITEMIDLIST pidlItem = (LPCITEMIDLIST)pListCtrl->GetItemData(nItem);
但是,从 Vista 的通用控件及更高版本开始,该技术失败了 :(
有什么想法吗?
编辑:我不仅需要能够获取列表视图中当前选定项目的信息,还需要获取列表视图中所有项目的信息。
EDIT2:我需要深入挖掘的原因:
在我们的应用程序的早期版本中,我们提供了以下功能: (1) 按下自定义按钮“预览”以关闭对话框,但将当前显示在视图中的项目列表按其可见顺序传输到应用程序,以及当前突出显示的索引。必须完全指定此列表 - 查看全部为“J1329192”的 3 个文件(当确实有 3 个文件“J1329192.xyz”“J1329192.xzy”和“J1329192.zyx”[按此顺序)是没有用的。
允许用户在“文件名:”字段中键入部分文件名过滤器,并且通用对话框将仅显示与给定部分过滤器匹配的文件,按用户选择的排序顺序。因此,要准确地向应用报告用户想要预览的内容,我们需要能够从列表视图控件(或公共对话框本身)中查询该信息。
我们还对文件对话框进行了其他增强 - 包括将用户当前选择显示为缩略图的就地预览窗格,以及自定义最近位置界面等。所有这些都是可能的(有很多工作) 在 Vista 之前。发布 Vista 后,我遇到了墙上的墙。目前,我们使用的标准文件对话框只有很少的我们自己的功能,这并不适合客户(功能 X 发生了什么?!)
还有其他增强功能,但这是一个很好的粗略概述。它们都归结为要求“真的,老实说,索引 X 的视图中具体是什么文件?”的知识。而且出于未知的原因——微软似乎并不觉得有必要提供这样的界面。事实上,他们从来没有这样做过。只有通过一些黑客攻击和逆向工程,我们才能弄清楚事情是如何在幕后工作的,并获得所需的信息。是的,这是不受支持的,是的,MS 不可避免地破坏了我们的代码。我真的不怪他们——我确实觉得令人讨厌的是,他们更新的、更漂亮的界面比他们的旧界面封闭得多——而且他们没有提供更多的前期界面——支持的界面——来进行这些对话增强.