WM_MOUSEMOVE GET_X_LPARAM AND GET_Y_LPARAM 抓错坐标

-1 c++ hook winapi mousemove

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        if (wParam == WM_MOUSEMOVE)
        {
            cout << "X : " << GET_X_LPARAM(lParam) << " Y: " << GET_Y_LPARAM(lParam) << "\n";
        }
    }
    return CallNextHookEx(hMSHook, nCode, wParam, lParam);
}

    int _tmain() {
        HMODULE hInstance = GetModuleHandle(NULL);
        hMSHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, hInstance, NULL);

        MSG Msg;

        while (GetMessage(&Msg, NULL, 0, 0)) { DispatchMessage(&Msg); }
        ::ReleaseDC(0, dc);

        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

结果 = 总是返回错误的坐标,

示例 = X = -1844,Y = 79,

X = -1556 Y = 271,

X = -1028 Y = 91

...

每次发布时价值都在变化

有人可以帮助我吗?

Sid*_*d S 5

lParam参数MouseProc与 的lParam参数不同WM_MOUSEMOVE。它是一个MOUSEHOOKSTRUCT *.

因此,更改MouseProc为:

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        auto &ms = * (const MOUSEHOOKSTRUCT *) lParam;
        if (wParam == WM_MOUSEMOVE)
        {
            cout << "X : " << ms.pt.x << " Y: " << ms.pt.y << "\n";
        }
    }
    return CallNextHookEx(hMSHook, nCode, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)