在窗口标题中更改光标

时间:2011-06-26 08:10:56

标签: c# winforms pinvoke wndproc

我有一个WinForm,现在我需要在Windows标题部分更改光标。我有一些代码工作,它有两个问题:

  1. <击> 它还会在边缘处更改光标(应显示正常的调整大小光标)。 我发现我需要这样的东西WM_NCHITTEST&amp; HTTOP,但如何将其合并?
  2. 移动鼠标时有一些闪烁。
  3. 我还尝试将代码放在base.WndProc(ref m);

    下面

    这是我已有的代码:

    if ((m.Msg == Win32.WM.NCMOUSEMOVE
        || m.Msg == Win32.WM.NCLBUTTONDOWN || m.Msg == Win32.WM.NCLBUTTONUP
        || m.Msg == Win32.WM.NCRBUTTONDOWN || m.Msg == Win32.WM.NCRBUTTONUP)
    )
    {
        if (m.WParam.ToInt32() != Win32.HT.TOP && m.WParam.ToInt32() != Win32.HT.RIGHT && m.WParam.ToInt32() != Win32.HT.BOTTOM && m.WParam.ToInt32() != Win32.HT.LEFT)
        {
            Cursor = Cursors.Hand;
        }
    }
    

    修改
    我没有在Spy ++中正确记录消息。找到窗口边缘的解决方案(参见更新的代码)。

    Thnx,J

1 个答案:

答案 0 :(得分:5)

它闪烁,因为你使用了错误的信息。任何鼠标移动后跟WM_SETCURSOR以允许应用程序更改光标。因此光标变回默认值。而是拦截WM_SETCURSOR。 LParam的低位字包含命中测试代码。

    protected override void WndProc(ref Message m) {
        if (m.Msg == 0x20) {  // Trap WM_SETCUROR
            if ((m.LParam.ToInt32() & 0xffff) == 2) { // Trap HTCAPTION
                Cursor.Current = Cursors.Hand;
                m.Result = (IntPtr)1;  // Processed
                return;
            }
        }
        base.WndProc(ref m);
    }