2011-11-04 99 views
12

我試圖從我自己的WinForm中的Windows任務欄顯示地址工具欄。我可以得到地址的CLSID toobar({01E04581-4EEE-11d0-BFE9-00AA005B4383}),我可以得到一個IDeskBand的引用。但是......那什麼?Windows窗體中的主機IDeskBand

Guid bandCLSID = new Guid("{01E04581-4EEE-11d0-BFE9-00AA005B4383}"); 
Type bandType = Type.GetTypeFromCLSID(bandCLSID); 
IDeskBand deskband = (IDeskBand)Activator.CreateInstance(bandType); 

我已經試過在AxHost收留了它,但地址欄是不是一個ActiveX控件。我已經打過電話

(deskband as IOleObjectWithSite).SetSite(various interfaces); 

(deskband as IDockingWindow).ShowDW(true); 

以及其他各種接口和他們的方法,但沒有我似乎得到我的任何地方。如果我真的能夠看到那個工具欄出現在任何地方,我會很高興。但我似乎無法彌合將IDeskBand引用並將其插入到我的Windows窗體之間的差距。

有沒有人試過這個,比我有更多的嘗試?

+0

您能否通過地址工具欄deskBand提供您需要哪些功能的更多信息?從Windows 7開始,這個接口已被棄用,所以它在未來的Windows版本中可能不會被支持。 –

+0

我希望能夠將地址桌面帶和其他桌面帶(如鏈接或甚至自定義桌面)放入我的WinForm中,並使它們在任務欄上顯示。 – deanis

+0

所以也許它不是我想要實現的'IDeskBand'。我很確定地址和鏈接工具欄是DeskBand COM對象,這就是我跳轉到IDeskBand的原因。所以我真正想要做的是查詢目標COM對象,我可以通過它來獲得匹配的Guid,實例化它,我使用'Activator.CreateInstance'完成。當我嘗試跳轉到在我的WinForm中託管COM對象時,事情正在崩潰。 – deanis

回答

1

我不認爲這是支持的,因爲DeskBand應該由資源管理器託管,但這裏有一個示例表單代碼,演示瞭如何做到這一點,並應該幫助您開始。

這個想法是你需要成爲「網站」,而不是資源管理器。如果你看這裏的文檔Creating Custom Explorer Bars, Tool Bands, and Desk Bands,你需要確保你的代碼像Explorer一樣行爲。所以,要做的第一件事就是給桌面帶對象一個「Site」實現,這個實現需要提供的第一個接口是IOleWindow。桌面帶對象會詢問您的「站點」,父窗口句柄是什麼。只要給窗體的句柄(例如)和臺帶顯示本身作爲一種形式的孩子:

enter image description here

注:因爲它已經實現,您不能使用任何形式或控制類作爲IOleWindow的實施者它背後的場景(Winforms的實現),這個實現是非常具體的,所以你需要一個自定義的站點,如這裏演示的。

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     private IObjectWithSite _band = (IObjectWithSite)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("{01E04581-4EEE-11d0-BFE9-00AA005B4383}"))); 
     private BandSite _site; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     protected override void CreateHandle() 
     { 
      base.CreateHandle(); 
      if (_site == null) 
      { 
       _site = new BandSite(Handle); 
       _band.SetSite(_site); 
      } 
     } 

     private class BandSite : IOleWindow 
     { 
      private IntPtr _hwnd; 

      public BandSite(IntPtr hwnd) 
      { 
       _hwnd = hwnd; 
      } 

      void IOleWindow.GetWindow(out IntPtr hwnd) 
      { 
       hwnd = _hwnd; 
      } 

      void IOleWindow.ContextSensitiveHelp(int fEnterMode) 
      { 
       throw new NotImplementedException(); 
      } 
     } 
    } 

    [ComImport, Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IObjectWithSite 
    { 
     void SetSite([MarshalAs(UnmanagedType.IUnknown)] object pUnkSite); 

     [return: MarshalAs(UnmanagedType.IUnknown)] 
     object GetSite(ref Guid riid); 
    } 

    [ComImport, Guid("00000114-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IOleWindow 
    { 
     void GetWindow(out IntPtr hwnd); 
     void ContextSensitiveHelp(int fEnterMode); 
    } 
} 
+0

好神聖的煙霧,工作!我只是託管了地址工具欄,然後是平板電腦輸入面板工具欄。出於某種原因,鏈接不適合我。如果你知道這是爲什麼,我會採取任何提示。我還必須弄清楚如何調整這些控件的大小,但至少現在我可以看到它們。感謝西蒙! – deanis

+0

任何人都有任何想法如何調整這個工具欄的大小?我試過了一堆不同的電話,但沒有運氣。 – deanis