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:
It also changes the cursor when on the edges (normal resize cursor should be shown). I found out the I need something like thisWM_NCHITTEST
&HTTOP
, but how do I combine that?- 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
开发者_StackOverflow || 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
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);
}
精彩评论