C++ 使用WH_鼠标和TrackMouseEvent设置WindowsHookx不捕获WM_MouseEvent
我使用SetWindowsHookEx()捕获WM_MOUSEMOVE,然后使用TrackMouseeEvent捕获WM_MOUSELEAVE,但我的MouseHook没有捕获WM_MOUSELEAVE 使用Spy++我可以判断WM_MOUSELEAVE是否被触发,但我的鼠标簿无法捕获消息。为什么?C++ 使用WH_鼠标和TrackMouseEvent设置WindowsHookx不捕获WM_MouseEvent,c++,winapi,C++,Winapi,我使用SetWindowsHookEx()捕获WM_MOUSEMOVE,然后使用TrackMouseeEvent捕获WM_MOUSELEAVE,但我的MouseHook没有捕获WM_MOUSELEAVE 使用Spy++我可以判断WM_MOUSELEAVE是否被触发,但我的鼠标簿无法捕获消息。为什么? LRESULT CALLBACK MouseHook(int nCode, WPARAM wp, LPARAM lp) { MOUSEHOOKSTRUCT *pmh = (MOUSEHO
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
时建立的内部计时器程序生成的(该程序反复检查鼠标是否离开窗口,并在离开窗口时向其发送消息)
您可能可以使用
WH_CALLWNDPROC
钩子捕获它。@jakaw您还可以使用GetCursorPoint()获取光标的位置,并使用GetWindowFromPoint()检查光标何时未超出预期窗口。在某些情况下,它比使用SetWindowHook要好。使用WH_GETMESSAGE可以很好地工作@TCS,谢谢,但在这种情况下,这不是更好的事情。但是谢谢你的帮助!当指定子窗口hwnd时,fwiw I似乎无法通过windows 7 x64上的WH_GETMESSAGE挂钩可靠地接收WM_MOUSELEAVE。