我不认为这是受支持的,因为 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);
}
}