2015-04-05 120 views
0

我正在開發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」內導航而不是打開新窗口?

+0

資源管理器從文件夾中的IContextMenu查詢的IObjectWithSite接口與對象調用IObjectWithSite.SetSite實現的IServiceProvider。打開命令處理程序使用站點並獲取IShellBrowser接口。如果找到IShellBrowser,則打開命令處理程序將其用於導航。 – 2015-04-05 20:05:18

+0

@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

回答

0

它必須是一個更好的方式來做到這一點,但這個工程:

HResult ICommDlgBrowser3.OnDefaultCommand(IntPtr ppshv) 
    { 
     if (SelectedItems.Count > 0) 
     { 
      var item = SelectedItems[0]; 

      ShellNativeMethods.ShellFileGetAttributesOptions sfgao; 
      item.NativeShellItem2.GetAttributes(ShellNativeMethods.ShellFileGetAttributesOptions.Folder, out sfgao); 
      bool isFolder = (sfgao & ShellNativeMethods.ShellFileGetAttributesOptions.Folder) != 0; 

      if (isFolder) 
      { 
       Navigate(SelectedItems[0]); 
       return HResult.Ok; 
      } 
     } 
     return HResult.False; 
    } 
1

我不是C#開發人員,我不知道Windows-API-Code-Pack-1.1的詳細信息。在我的NSE項目中,我使用的導航如下算法在當前瀏覽器窗口(IContextMenu處理程序的一部分):

Site.QueryInterface(IServiceProvider, ServiceProvider) // Site was received in IObjectWithSite.SetSite 
ServiceProvider.QueryService(SID_STopLevelBrowser, IShellBrowser, ShellBrowser) 
ShellBrowser.BrowseObject(ChildItem, SBSP_RELATIVE or SBSP_SAMEBROWSER) 

也許這會幫助你。

+0

我想我終於明白,你在談論類似這樣的東西http://stackoverflow.com/questions/28166945/getting-the-results-of-an-explorer-shell-search-in-a-program-hat -was-launch-f,基本上說我必須創建shell擴展,而不是在註冊表中推它。你真的幫了我很多,謝謝! – formatc 2015-04-07 09:56:51

+0

我創建了外殼擴展,就像我在之前的評論中鏈接到的問題所解釋的那樣,並且我的站點在我的SetSite函數中實現了IServiceProvider,另外一件我瘋狂的事情是我無法調用我的InvokeCommand當我雙擊文件夾中的資源管理器,而它的工作原理右鍵點擊 - >打開,任何想法? – formatc 2015-04-07 19:09:37

+0

我是否正確理解您 - 當您雙擊文件夾時,您的外殼擴展程序已創建,但IObjectWithSite.SetSite未被調用? – 2015-04-08 04:02:07

相關問題