我正在開發Windows文件管理器應用程序,essentialy它包裝IExplorerBrowser給我精確的控件,就像你在Windows資源管理器中一樣。IExplorerBrowser - 在不啓動默認應用程序的情況下瀏覽
我已經實現了使用Mutex和IPC傳遞參數的單個實例。
所以現在我想能夠註冊我的文件管理器作爲默認應用程序,當你從ie打開目錄。桌面
所以我創造了這樣的註冊表腳本:
REGEDIT4
[HKEY_CURRENT_USER\Software\Classes\Drive\shell]
@="AppName"
[HKEY_CURRENT_USER\Software\Classes\Drive\shell\AppName]
@="Open in AppName"
[HKEY_CURRENT_USER\Software\Classes\Drive\shell\AppName\command]
@="\"<app-path>\" %1"
[HKEY_CURRENT_USER\Software\Classes\Directory\shell]
@="AppName"
[HKEY_CURRENT_USER\Software\Classes\Directory\shell\AppName]
@="Open in AppName"
[HKEY_CURRENT_USER\Software\Classes\Directory\shell\AppName\command]
@="\"<app-path>\" \"%1\""
它能正常工作,如果我雙擊目錄啓動我的應用程序,因爲我實現的單個實例不產卵多個實例。
由於我在我的應用程序中有選項卡式界面,每次打開目錄時,它都會使用IExplorerBrowser控件創建新選項卡。
問題是,現在IExplorerBrowser控件行爲已經改變,當我從控件打開目錄時,我得到新的選項卡,而不是在控件內部導航,這是合乎邏輯的(它始終調用註冊表命令,以direcotry作爲arg啓動我的應用程序)
TL; DR;
Windows資源管理器如何處理? Windows資源管理器如何知道是否從ie打開目錄。桌面,還是從Windows資源管理器內部,以便它在「listview」內導航而不是打開新窗口?
資源管理器從文件夾中的IContextMenu查詢的IObjectWithSite接口與對象調用IObjectWithSite.SetSite實現的IServiceProvider。打開命令處理程序使用站點並獲取IShellBrowser接口。如果找到IShellBrowser,則打開命令處理程序將其用於導航。 – 2015-04-05 20:05:18
@DenisAnisimov我正在使用這個[Windows-API-Code-Pack-1.1](https://github.com/aybe/Windows-API-Code-Pack-1.1/blob/master/source/WindowsAPICodePack/Shell/ ExplorerBrowser/ExplorerBrowser.cs)IExplorerBrowser的C#實現,如果我正確理解你的意思,HResult Microsoft.WindowsAPICodePack.Controls.IServiceProvider.QueryService應該返回HResult.Ok的RIID和接口指針? – formatc 2015-04-06 11:32:37