2011-11-04 97 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