关于鼠标钩子使用入门
1. MOUSEHOOKSTRUCT 鼠标钩子结构体
当WH_MOUSE钩子处理的鼠标事件时,该结构包含鼠标信息。
typedef struct {
POINT pt;
HWND hwnd;
UINT wHitTestCode;
ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
参数:
pt : POINT结构对象,保存鼠标在屏幕上的x,y坐标
hwnd: 接收到鼠标消息的窗口的句柄
wHitTestCode: hit-test值,详细描述参见WM_NCHITTEST消息
dwExtraInfo: 指定与本消息联系的额外消息
2. WM_NCHITTEST 消息
The WM_NCHITTEST message is sent to a window when the cursor moves, or when a mouse button is pressed or released.
WM_NCHITTEST消息当鼠标移动、按下、松开都会被发送。如果鼠标不被捕获,消息在窗体得到光标之后发出。否则,消息发送到捕获到鼠标的窗体。
xPos = LOWORD(lParam); // 光标的水平位置(X)
yPos = HIWORD(lParam); // 光标的垂直位置(Y)
3. 鼠标消息的关系理解
无标题窗口拖动,我们一般是采用:
响应WM_NCHITTEST消息,返回HTCAPTION来实现。
但是,如果在这同时还要处理鼠标的消息,如WM_LBUTTONDOWN、WM_LBUTTONUP、WM_RBUTTONUP、WM_MOUSEMOVE,你会发现,这些消息都收不到了。
因为你在WM_NCHITTEST中处理了鼠标消息,把他定位成HTCAPTION,也就是鼠标在标题栏上,而标题栏属于非客户区(NC);
非客户区的事件消息都是以WM_NC开头的。也就是说,当你的WM_NCHITTEST返回HTCAPTION时,原来可以用WM_LBUTTONUP处理的消息,你只能用WM_NCLBUTTONUP来处理。
自然是同时处理WM_NCHITTEST和WM_NCRBUTTONUP,而不处理WM_RBUTTONUP
4. 鼠标钩子的使用
5. 参考资料
MOUSEHOOKSTRUCT
http://baike.baidu.com/view/2764699.htm
WM_NCHITTEST消息说明
http://blog.csdn.net/zhuzhubin/archive/2009/07/17/4356825.aspx
WM_NCHITTEST后鼠标消息收不到
http://blog.csdn.net/debehe/archive/2009/08/05/4412959.aspx