我使用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钩子将其捕获。

10-08 08:30