Windows窗体中的主机IDeskBand

dea*_*nis 12 .net c# interop winforms-interop winforms

我正在尝试从我自己的WinForm中的Windows任务栏显示地址工具栏.我可以得到地址toobar({01E04581-4EEE-11d0-BFE9-00AA005B4383})的CLSID ,我可以得到IDeskBand它的引用.但是......那又怎样?

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

我试过托管它AxHost,但地址工具栏不是ActiveX控件.我试过打电话

(deskband as IOleObjectWithSite).SetSite(various interfaces);
Run Code Online (Sandbox Code Playgroud)

要么

(deskband as IDockingWindow).ShowDW(true);
Run Code Online (Sandbox Code Playgroud)

以及各种其他接口和他们的方法,但我做的任何事情似乎都没有让我到处.如果我真的能看到工具栏出现在任何地方,我会高兴的.但我似乎无法弥合IDeskBand引用和将其插入我的Windows窗体之间的差距.

有没有人试过这个,并且比我更进一步?

Sim*_*ier 1

我不认为这是受支持的,因为 DeskBand 应该由 Explorer 托管,但这里有一个示例表单代码,演示了如何执行此操作,并且应该帮助您入门。

这个想法是你需要成为“站点”,而不是资源管理器。如果您查看此处的文档创建自定义资源管理器栏、工具带和桌面带,您需要确保您的代码的行为类似于资源管理器的行为。因此,首先要做的就是为桌带对象提供一个“Site”实现,该实现需要提供的第一个接口是 IOleWindow。桌面带对象将询问您的“站点”父窗口句柄是什么。只需提供表单的句柄(例如),桌面区域就会将其自身显示为表单的子项:

在此输入图像描述

注意:您不能使用任何 Form 或 Control 类作为 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);
    }
}
Run Code Online (Sandbox Code Playgroud)