在窗口标题中更改光标

jer*_*one 1 c# pinvoke wndproc winforms

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

  1. 它还会在边缘处更改光标(应显示正常的调整大小光标).我发现了,我需要这样的事情WM_NCHITTESTHTTOP,但我怎么结合呢?
  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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:
我没有在Spy ++中正确记录消息.找到窗口边缘的解决方案(请参阅更新的代码).

Thnx,J

Han*_*ant 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);
    }
Run Code Online (Sandbox Code Playgroud)