gpt4 book ai didi

c# - 在 Windows 窗体中托管 IDeskBand

转载 作者:可可西里 更新时间:2023-11-01 08:29:50 25 4
gpt4 key购买 nike

我试图在我自己的 WinForm 中显示 Windows 任务栏中的地址工具栏。我可以获得地址工具栏的 CLSID ({01E04581-4EEE-11d0-BFE9-00AA005B4383}),并且可以获得对它的 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);

以及各种其他接口(interface)及其方法,但我所做的一切似乎都无济于事。如果我真的能看到工具栏出现在任何地方,我会很高兴。但我似乎无法弥合拥有 IDeskBand 引用并将其插入我的 Windows 窗体之间的差距。

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

最佳答案

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

想法是您需要成为“站点”,而不是资源管理器。如果您在这里查看文档 Creating Custom Explorer Bars, Tool Bands, and Desk Bands ,您需要确保您的代码的行为与资源管理器的行为相似。因此,首先要做的是为桌面带对象提供一个“Site”实现,这个实现需要提供的第一个接口(interface)是 IOleWindow。桌面带对象将询问您的“站点”父窗口句柄是什么。只需给出表单的句柄(例如),桌面带就会将自己显示为表单的子项:

enter image description here

注意:您不能使用任何 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);
}
}

关于c# - 在 Windows 窗体中托管 IDeskBand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8015275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com