如何在Windows 7库中的IExplorerBrowser中按文件类型进行过滤?

时间:2009-10-19 15:35:48

标签: windows-7 libraries

我在我的代码中创建了一个IExplorerBrowser实例,用于在我的一个对话框中创建自定义I / O视图。我在我的宿主类中实现了IServiceProvider和ICommDlgBrowser接口。我使用IExplorerBrowser :: BrowseToIDList方法来填充视图。

我想过滤显示的文件类型(例如只有PNG文件)。如果我用 FOLDERID_Pictures (即“我的图片”)调用BrowseToIDList,我可以使用ICommDlgBrowser :: IncludeObject方法或IFolderFilter :: ShouldShow来限制我允许显示的文件。但是,如果我浏览到Windows 7上的图片库( FOLDERID_PicturesLibrary ),则不会调用ICommDlgBrowser :: IncludeObject和IFolderFilter :: ShouldShow。

在Win7上过滤我不知道的库中的文件是否有一些限制?也许我错过了一个界面,或者我在某个地方指定了错误的标志。

非常感谢任何想法。

3 个答案:

答案 0 :(得分:2)

我有机会进一步研究这个问题,包括向一些微软开发人员提出几个问题。遗憾的是,过滤不适用于查询支持的视图(即库)。

我的方法的另一种方法是使用Common Item Dialog和应用程序添加的控件(通过IFileDialogCustomize)。

http://msdn.microsoft.com/en-us/library/bb776913(VS.85).aspx

在我的具体情况下,我无法使用Common Item Dialog,但我认为在此处发布此信息以供将来参考可能是值得的。

如果将来我找到任何方法来过滤IExplorerBrowser控件,我也会在这里发布。

答案 1 :(得分:1)

我自己遇到过这个问题。

然而我进一步研究了它。 IExplorerBrowser创建(在我的Windows 7 x64计算机上)ExplorerBrowserControl类的窗口。它本身创建了一个DUIViewWndClassName类的窗口。并且同一个窗口(DUIViewWndClassName)用作IFileOpenDialog创建的对话框的控件。甚至窗口过程都是相同的,因此没有子类化(但我没有检查该控件的每个子窗口。)

文件对话框甚至可以在库文件夹中按文件类型进行过滤。所以我想IExplorerBrowser(或它使用的控件)确实允许只有微软不分享知识如何做到这一点。或者,如果确实如此,那就是它隐藏的知识。

但是我使用了IFolderFilterSite(来自IExplorerBrowser的{​​{1}}支持的界面)。在这种情况下,库文件夹不会调用CLSID_ExplorerBrowser。我无法调用IFolderFilter::ShouldShow(即使我没有设置任何ICommDlgBrowser::IncludeObject)。


编辑:我设法调用IFolderFilter。不知怎的,我忘记了我必须通过ICommDlgBrowser::IncludeObject而不是ICommDlgBrowser提供IServiceProvider::QueryService。但是仍然没有为库文件夹调用IUnknown::QueryInterface

答案 2 :(得分:-1)

我尝试使用IShellFolderViewDual3-> FilterView() 但这是搜索结果 谢谢。

IShellView * pShellView;
IDispatch * pDSFV;
IShellFolderViewDual3 * pSFVD3;

m_pExplorerBrowser-> GetCurrentView(IID_PPV_ARGS(安培; pShellView));
pShellView-> GetItemObject(SVGIO_BACKGROUND,IID_PPV_ARGS(& pDSFV));
pDSFV->的QueryInterface(IID_PPV_ARGS(安培; pSFVD3));
pSFVD3-> FilterView(bstrVal);