Change cursor in window caption

耗尽温柔 提交于 2020-02-02 13:11:49

问题


I have a WinForm and now I need to change the cursor when it's in the windows caption part. I have some code working, it has 2 problems:

  1. It also changes the cursor when on the edges (normal resize cursor should be shown). I found out the I need something like this WM_NCHITTEST & HTTOP, but how do I combine that?
  2. There's some flicker when moving the mouse.

I also tried placing the code below the base.WndProc(ref m);.

This is the code I already have:

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;
    }
}

EDIT:
I wasn't logging the message correctly in Spy++. Found the solution to the window edges (see updated code).

Thnx, J


回答1:


It flickers because you use the wrong message. Any mouse move is followed by WM_SETCURSOR to allow the app to change the cursor. So the cursor changes back to the default. Intercept WM_SETCURSOR instead. The low word of LParam contains the hit test code.

    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);
    }


来源:https://stackoverflow.com/questions/6482878/change-cursor-in-window-caption

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!