一、检测鼠标:
判断是否有鼠标: GetSystemMetrics(SM_MOUSEPRESENT);//WINDOWS98后有效
判断鼠标几个键:GetSystemMetrics(SM_CMOUSEBUTTONS);//WINDOWS98后有效
二、鼠标消息,总共21个:
客户区消息
#define WM_MOUSEMOVE 0x0200
#define WM_LBUTTONDOWN 0x0201
#define WM_LBUTTONUP 0x0202
#define WM_LBUTTONDBLCLK 0x0203
#define WM_RBUTTONDOWN 0x0204
#define WM_RBUTTONUP 0x0205
#define WM_RBUTTONDBLCLK 0x0206
#define WM_MBUTTONDOWN 0x0207
#define WM_MBUTTONUP 0x0208
#define WM_MBUTTONDBLCLK 0x0209
非客户去消息
#define WM_NCMOUSEMOVE 0x00A0
#define WM_NCLBUTTONDOWN 0x00A1
#define WM_NCLBUTTONUP 0x00A2
#define WM_NCLBUTTONDBLCLK 0x00A3
#define WM_NCRBUTTONDOWN 0x00A4
#define WM_NCRBUTTONUP 0x00A5
#define WM_NCRBUTTONDBLCLK 0x00A6
#define WM_NCMBUTTONDOWN 0x00A7
#define WM_NCMBUTTONUP 0x00A8
#define WM_NCMBUTTONDBLCLK 0x00A9
#define WM_NCHITTEST 0x0084
lParam 表示鼠标位置,高位y,低位x。对客户区消息来讲,是客户区坐标,对非客户区消息来说,是屏幕坐标。
wParam 对客户区消息来说,表示鼠标键及SHIFT和CTRL状态。
判断如下:
wParam & MK_LBUTTON
wParam & MK_RBUTTON
wParam & MK_MBUTTON
wParam & MK_SHIFT
wParam & MK_CONTROL
这些在处理MOUSEMOVE的时候比较有用,比如在移动中判断是否按下按钮,在移动中是否按着SHIFT或CTRL。
对非客户区消息来说,表示移动或者单击的非客户区位置。
三、鼠标消息的处理过程。
关键:WM_NCHITTEST,命中测试消息。
此消息优于其他一切客户消息和非客户鼠标消息。 lParam代表x,y屏幕坐标。wParam没用。
window应用程序把这个消息发送给DefWindowProc,然后产生基于鼠标位置的所有其他鼠标消息。
对非客户消息,DefWindowProc的返回值作为wParam的参数,这个值可以是任何非客户区消息加上以下内容:
HTCLIENT 客户区 //如果是这个,会将屏幕坐标转化为客户区左边,然后产生客户区消息。
HTNOWHERE 不在窗口中
HTTRANSPARENT 窗口由另一个窗口覆盖
HRERROR 使DefWindowProc发出轰鸣声。
举例:禁止窗口鼠标事件:
case WM_NCHITTEST:
return (LRESULT)HTNOWHERE;
四、光标函数:
LoadCursor
SetCursor
ShowCursor
GetCursorPos
五,如果一个自定义窗口在定义的时候,不包含CS_DBLCLKS,那窗口不会接收到双击事件,只能是两个单击。
六、捕获和释放鼠标。
SetCapture(hwnd);
ReleaseCapture();
捕获鼠标后,不管鼠标在什么地方产生消息,消息都会以客户区消息的方式传送给hwnd窗口。
七、滚动轮。
滚动轮产生消息:WM_MOUSEWHEEL
wParam 表明鼠标键及SHIFT\CTRL是否被按下
wParam的高位表示转动的方向,正为前,负为后,等于120或-120。40为一行,所以滚动一下前进或后退3行。
lParam 获取鼠标的位置,是相对于屏幕左上角的,而不是客户区的。