在公共文件对话框中获取当前选择文件的真实名称?

时间:2009-11-18 16:09:15

标签: c++ windows com openfiledialog comctl32

可以在常用对话框的列表视图中获取所选项目的文本。但是一个人无法得到它的PIDL,如果用户选择隐藏已知的扩展(默认),那么如果没有扩展名或其PIDL,就无法确定选择了哪个文件。

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

  1. 从中获取IShellView 标准打开文件对话框。该 底层IShellView可以说明什么 PIDL用于当前 选择。所以,如果我能够得到 看看IShellView,我会的 金色。不幸的是,我看不到 CDM_xxx会做到这一点。和我 无法想到我的头脑 任何可能实现它的东西! :(
  2. 其他一些想法?!
  3. 我们过去依赖于Windows 9x,2000和XP版本的公共文件对话框将每个项目的PIDL存储在LVITEM数据中(原始信用保存给Paul DiLascia):

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

    然而,从Vista的常用控件开始,该技术失败了:(

    有什么想法吗?

    编辑:我需要能够获取此信息,不仅可以获取列表视图中当前选定的项目,还可以获取列表视图中的所有项目。

    EDIT2:我需要深入挖掘的原因:

    在我们的应用程序的早期版本中,我们提供了以下功能:(1)按下关闭对话框的自定义按钮“预览”,但是以可见顺序将当前显示在视图中的项目列表传输到应用程序,以及当前突出显示的索引。这个列表必须完全指定 - 看到3个文件都是“J1329192”(当真正有3个文件“J1329192.xyz”“J1329192.xzy”和“J1329192.zyx”[按此顺序]时没用。

    允许用户在“文件名:”字段中键入部分文件名过滤器,并且公共对话框将仅按用户选择的排序顺序显示与给定部分过滤器匹配的文件。因此,要准确地向应用程序报告用户想要预览的内容,需要我们能够从列表视图控件(或公共对话框本身)查询该信息。

    我们还对文件对话框进行了其他增强 - 包括一个就地预览窗格,它将用户当前选择显示为缩略图,并具有自定义的最近位置界面等。所有这些都是可能的(有很多工作)在Vista之前。发布Vista后,我遇到了墙上的墙。目前,我们使用的标准文件对话框只有我们自己的一些功能,这对客户来说并不合适(功能X发生了什么?!)

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

3 个答案:

答案 0 :(得分:2)

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

您知道使用无证件行为的通常后果吗?

答案 1 :(得分:1)

啊,我找到了。您将要使用IFileOpenDialog用于Vista,这应该非常支持您提到的所有操作。

答案 2 :(得分:1)

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

我认为你需要在构造函数中的BOOL参数中传递FALSE以关闭Vista样式的对话框。