【问题标题】:Cannot finish implementing IDeskBand2 interface无法完成 IDeskBand2 接口的实现
【发布时间】:2014-06-20 19:29:43
【问题描述】:

我正在尝试在我的应用程序的任务栏中实现一个 DeskBand,我已经检查了 documentation,但它非常稀疏。它没有解释如何实现 IDeskBand2 接口。

我在网上找到的关于此的信息非常少,而且我发现的东西不起作用。我发现 CodeProject 上看起来很有前途的一段代码只不过是编译时错误的源泉,直到今天我偶然发现了this 网站。

到目前为止,我得到的是这样的:

class COMInterop
{
    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    [Guid("79D16DE4-ABEE-4021-8D9D-9169B261D657")]

    public interface IDeskBand2
    {
        void GetWindow(out System.IntPtr phwnd);
        void ContextSensitiveHelp([In] bool fEnterMode);
        void ShowDW([In] bool fShow);
        void CloseDW([In] UInt32 dwReserved);
        void ResizeBorderDW(IntPtr prcBorder, [In, MarshalAs(UnmanagedType.IUnknown)] Object punkToolbarSite, bool fReserved);

        void GetBandInfo(UInt32 dwBandID, UInt32 dwViewMode, ref DESKBANDINFO pdbi);
        bool CanRenderComposited();
        bool GetCompositionState();
        void SetCompositionState(bool fCompositionEnabled);
    }
}

位于名为 COMInterop.cs 的 Class 文件中。

我现在遇到的问题在第 24 行。它说找不到The type or namespace 'DESKBANDINFO。 (您是否缺少 using 指令或程序集引用?)

我如何实现这一点 - 您是否有任何适用于 Windows 7+ 的 DeskBand(见下图)好的文档?

【问题讨论】:

  • 也许这个P/Invoke info可以帮助你?
  • 感谢@pasty,但现在它说找不到 DBIM。我正在尝试在线搜索以了解原因。
  • 您可以在 P/Invoke 网站上搜索您需要的结构...
  • 不要在 .NET 中编写桌带。 Deskbands 在 Explorer.exe 进程中运行,因此出于同样的原因不应该用 .NET 编写 shell extensions shouldn't be written in .NET

标签: c# .net winforms com


【解决方案1】:

DESKBAND info 是一个记录在here 的结构。您可以在 pinvoke.net 上找到 C# 翻译。

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;

    public POINT(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }

    public POINT(System.Drawing.Point pt) : this(pt.X, pt.Y) { }

    public static implicit operator System.Drawing.Point(POINT p)
    {
        return new System.Drawing.Point(p.X, p.Y);
    }

    public static implicit operator POINT(System.Drawing.Point p)
    {
        return new POINT(p.X, p.Y);
    }
}

[StructLayout (LayoutKind.Sequential, CharSet=CharSet.Unicode)]
struct DESKBANDINFO {
    public uint dwMask;
    public Point ptMinSize;
    public Point ptMaxSize;
    public Point ptIntegral;
    public Point ptActual;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
    public String wszTitle;
    public uint dwModeFlags;
    public Int32 crBkgnd; 
}

deskband API documentation 明确声明它是一个已弃用的 API。它说:

重要提示您应该在新开发中使用缩略图工具栏来代替桌面带,Windows 7 不支持这些工具栏。

换句话说,您几乎肯定不会使用deskband API 来解决您的问题。

也就是说,如果您想了解如何使用桌带 API,请查看 C++ 中的示例代码。不要将搜索限制为 C#。期望在 C++ 中找到好的示例,但在 C# 中找不到。

【讨论】:

  • 我使用的是 Windows 8.1,在任务栏上,Microsoft 在任务栏上实现了一个名为 Touch Keyboard 的 DeskBand - 您单击它,触摸键盘就会打开。如果它已被弃用,那么我假设他们不打算很快摆脱它。另外,我不喜欢缩略图工具栏,它们与我想要做的完全相反。
  • 我只是告诉你官方线路是什么。显然你可以随心所欲。 ;-)
  • 感谢您的回答@David,这只是我长期以来一直试图弄清楚的个人项目。我真的需要完成它。即使它将来可能无法正常工作:) 现在所有这些错误都消失了!我仍然不确定调用哪些方法才能真正让 DeskBand 出现在任务栏上,以及在什么时候调用这些方法。
  • 查找用 c++ 编写的示例项目
  • 噢噢噢噢。好的。再次感谢您的帮助:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2014-04-12
  • 2015-12-26
  • 2023-03-04
  • 2017-08-17
相关资源
最近更新 更多