2009-10-19 55 views
4

我在我的代碼中創建了一個IExplorerBrowser的實例,在我的一個對話框中創建一個自定義的I/O視圖。我在我的主機類中實現了IServiceProvider和ICommDlgBrowser接口。我使用IExplorerBrowser :: BrowseToIDList方法來填充視圖。如何通過Windows 7庫中的IExplorerBrowser中的文件類型進行篩選?

我想過濾顯示的文件類型(例如只有PNG文件)。如果我用FOLDERID_Pictures(即「我的圖片」)調用BrowseToIDList,我可以使用ICommDlgBrowser :: IncludeObject方法或IFolderFilter :: ShouldShow來限制允許顯示哪些文件。但是,如果我瀏覽Windows 7上的圖片庫(FOLDERID_PicturesLibrary),則不會調用ICommDlgBrowser :: IncludeObject或IFolderFilter :: ShouldShow。

在Win7上過濾庫中的文件有一些限制,我不知道?也許我錯過了一個接口,或者我在某處指定了錯誤的標誌。

任何想法將不勝感激。

+0

[這花了我很長一段時間(https://msdn.microsoft.com/en-us/library/windows/desktop/bb761909%28v=vs.85%29.aspx):「請注意,如果通過調用「IFolderFilterSite :: SetFilter」在瀏覽器上設置了文件夾篩選器,則客戶端不會收到對「ICommDlgBrowser :: IncludeObject」的調用。 – 2015-04-24 11:19:55

回答

2

我有機會進一步研究這個問題,包括向一些微軟開發人員提出幾個問題。不幸的是,過濾不適用於查詢支持的視圖(即庫)。

我的方法的替代方法是使用Common Item對話框和應用程序添加的控件(通過IFileDialogCustomize)。

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

在我的特定情況下,我無法使用通用項對話框,但我認爲這可能是值得在這裏發佈此信息以供將來參考。

如果將來我會找到任何方法來過濾IExplorerBrowser控件,我也會在這裏發佈它。

1

我自己也遇到過這個問題。

但我已經調查了一點。 IExplorerBrowser創建(在我的Windows 7 x64機器上)ExplorerBrowserControl類的窗口。這本身創建了一個類DUIViewWndClassName的窗口。和同一個窗口(DUIViewWndClassName)被用作由IFileOpenDialog創建的對話框的控件。即使窗口程序是相同的,所以沒有子類(但我沒有檢查每個子控件的窗口)。

即使在庫文件夾中,文件對話框也可以按文件類型進行過濾。所以我猜想IExplorerBrowser(或者它使用的控件)確實只允許微軟不分享知識如何做到這一點。或者,如果它確實有些隱藏的知識。

但我用IFolderFilterSite(接口由IExplorerBrowserCLSID_ExplorerBrowser支持)得到它。在這種情況下,不會爲庫文件夾調用IFolderFilter::ShouldShow。我無法獲得ICommDlgBrowser::IncludeObject調用(即使我沒有設置任何IFolderFilter)。


編輯:我設法得到ICommDlgBrowser::IncludeObject調用。不知何故,我忘了我必須提供ICommDlgBrowserIServiceProvider::QueryService而不是通過IUnknown::QueryInterface。但仍不調用庫文件夾ICommDlgBrowser::IncludeObject

+1

我已經做了幾個(仍然不成功)的實驗,並在MSDN論壇上提問:http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/252a9c82-617c-4126-8347-56dcedb4342f 。 – 2011-08-30 09:31:56

-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);

+2

本帖子目的不明確。請添加一些解釋。你是說這是解決這個問題的方法嗎?或者你是否在尋求類似問題的幫助? – AdrianHHH 2014-02-09 13:54:50

相關問題