【问题标题】:Desktop Gadgets alternatives on windows 10Windows 10 上的桌面小工具替代品
【发布时间】:2016-06-29 19:10:57
【问题描述】:

我想在桌面上有一个小窗口,它总是在桌面上,它只有两个按钮(可以做一些工作),因为桌面小工具从 Windows 8 中停止。任何其他硬代码替代品去做?

【问题讨论】:

    标签: windows winforms windows-desktop-gadgets


    【解决方案1】:

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

    1. 将表单的 ShowInTaskbar 属性设置为 false,因此它不会显示在任务栏中。
    2. 将表单的BorderStyle 属性设置为无。 (删除标题栏、最小化/最大化按钮等也很方便)
    3. 重写窗体的窗口过程,并处理WM_WINDOWPOSCHANGING 消息,这样您就可以将窗口保持在Z-Order 的底部。
    4. 处理表单的WM_NCHITTEST 消息,以便您可以通过拖动表单的背景来移动表单。返回HTCAPTION,这样系统就像您的鼠标在表单的标题栏中一样。

    作为一个简单的演示,创建一个表单,将 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多