Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用WH_鼠标和TrackMouseEvent设置WindowsHookx不捕获WM_MouseEvent_C++_Winapi - Fatal编程技术网

C++ 使用WH_鼠标和TrackMouseEvent设置WindowsHookx不捕获WM_MouseEvent

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

我使用SetWindowsHookEx()捕获WM_MOUSEMOVE,然后使用TrackMouseeEvent捕获WM_MOUSELEAVE,但我的MouseHook没有捕获WM_MOUSELEAVE

使用Spy++我可以判断WM_MOUSELEAVE是否被触发,但我的鼠标簿无法捕获消息。为什么?

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。