Windows 10上的桌面小工具替代品

时间:2016-06-29 19:10:58

标签: windows winforms windows-desktop-gadgets

我希望在桌面上有一个小窗口,它总是在桌面上,它只有两个按钮(有一些工作),因为桌面小工具已停止使用Windows 8.Any Other Hard - 这样做的替代方案?

1 个答案:

答案 0 :(得分:2)

是的,但这确实需要一些工作。概述过程:

  1. 将表单的ShowInTaskbar属性设置为false,因此它不会显示在任务栏中。
  2. 将表单的BorderStyle属性设置为None。 (这也很方便地删除了标题栏,最小化/最大化按钮等)。
  3. 覆盖表单的窗口过程,并处理WM_WINDOWPOSCHANGING消息,以便您可以将窗口保留在Z-Order的底部。
  4. 处理表单的WM_NCHITTEST消息,以便您可以通过拖动窗体的背景来移动表单。返回HTCAPTION,以便系统的行为就像您的鼠标位于表单的标题栏中一样。
  5. 作为一个简单的演示,创建一个表单,ShowInTaskbar属性设置为false,BorderStyle设置为None。然后添加以下代码:

    static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
    private const int WM_NCHITTEST = 0x0084;
    private const int WM_WINDOWPOSCHANGING = 0x0046;
    private const int HTCAPTION = 2;
    private const int HTCLIENT = 1;
    
    private struct WINDOWPOS
    {
        public IntPtr hwnd;
        public IntPtr hwndInsertAfter;
        public int x;
        public int y;
        public int cx;
        public int cy;
        public uint flags;
    }
    
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_NCHITTEST)
        {
            m.Result = new IntPtr(HTCAPTION);
            return;
        }
        else if (m.Msg == WM_WINDOWPOSCHANGING)
        {
            WINDOWPOS posInfo = Marshal.PtrToStructure<WINDOWPOS>(m.LParam);
            posInfo.hwndInsertAfter = HWND_BOTTOM;
            Marshal.StructureToPtr(posInfo, m.LParam, true);
        }
        base.WndProc(ref m);
    }