1

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

  1. 它还会在边缘更改光标(应显示正常调整大小的光标)。我发现我需要这样的东西WM_NCHITTEST& HTTOP,但我该如何结合呢?
  2. 移动鼠标时有一些闪烁。

我还尝试将代码放在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++ 中正确记录消息。找到了窗口边缘的解决方案(请参阅更新的代码)。

恩克斯,J

4

1 回答 1

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);
    }
于 2011-06-26T14:43:05.617 回答