首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows窗体中承载IDeskBand

在Windows窗体中承载IDeskBand
EN

Stack Overflow用户
提问于 2011-11-05 04:19:58
回答 1查看 1K关注 0票数 12

我正在尝试在我自己的WinForm中显示Windows任务栏中的地址工具栏。我可以获得地址工具栏({01E04581-4EEE-11d0-BFE9-00AA005B4383})的CLSID,还可以获得对它的IDeskBand引用。但是..。然后呢?

代码语言:javascript
复制
Guid bandCLSID = new Guid("{01E04581-4EEE-11d0-BFE9-00AA005B4383}");
Type bandType = Type.GetTypeFromCLSID(bandCLSID);
IDeskBand deskband = (IDeskBand)Activator.CreateInstance(bandType);

我曾尝试将其托管在AxHost中,但Address工具栏不是ActiveX控件。我试着给你打电话

代码语言:javascript
复制
(deskband as IOleObjectWithSite).SetSite(various interfaces);

代码语言:javascript
复制
(deskband as IDockingWindow).ShowDW(true);

以及各种其他接口和它们的方法,但我所做的一切似乎都无济于事。如果我真的能看到工具栏出现在任何地方,我会欣喜若狂。但我似乎无法在拥有IDeskBand引用和将其插入到窗体中之间架起一座桥梁。

以前有没有人尝试过这样做,并且比我走得更远?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-03 02:08:34

我不认为这是受支持的,因为DeskBand应该是由资源管理器托管的,但这里有一个示例表单代码,它演示了如何做到这一点,应该有助于您入门。

这个想法是你需要成为“站点”,而不是探索者。如果你看过这里的文档,你需要确保你的代码像Creating Custom Explorer Bars, Tool Bands, and Desk Bands一样工作。因此,首先要做的是为桌面band对象提供一个"Site“实现,该实现需要提供的第一个接口是IOleWindow。桌面带对象将询问您的“站点”父窗口句柄是什么。只需给出窗体的句柄(例如),桌面带就会显示为窗体的子级:

注意:您不能使用任何窗体或控件类作为IOleWindow实现者,因为它已经在幕后实现它(Winforms实现),而且此实现非常具体,因此您需要一个自定义站点,如本文所示。

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8015275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档