我使用SetWindowsHookEx()捕获WM_MOUSEMOVE,然后使用TrackMouseEvent捕获WM_MOUSELEAVE,但是我的MouseHook不能捕获WM_MOUSELEAVE。
使用Spy ++,我可以确定已触发WM_MOUSELEAVE,但是我的MouseHook无法捕获消息。为什么?
LRESULT CALLBACK MouseHook(int nCode, WPARAM wp, LPARAM lp)
{
MOUSEHOOKSTRUCT *pmh = (MOUSEHOOKSTRUCT *) lp;
if (nCode >= 0) {
if( wp == WM_MOUSEMOVE) {
if(!tracking){
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = pmh->hwnd;
TrackMouseEvent(&tme);
tracking = true;
}
}
}
if( wp == WM_MOUSELEAVE){
if(tracking){
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE & TME_CANCEL;
tme.hwndTrack = pmh->hwnd;
TrackMouseEvent(&tme);
tracking = false;
}
}
return CallNextHookEx(NULL, nCode, wp, lp);
}
最佳答案
WM_MOUSELEAVE
不是真正的鼠标消息,它是由调用TrackMouseEvent
时建立的内部计时器proc生成的(它会反复检查鼠标是否离开了窗口,并在出现时向它发送消息)。
您可能会用WH_CALLWNDPROC
钩子将其捕获。