WM_MOUSEMOVE GET_X_LPARAM И GET_Y_LPARAM Поймать неправильные координаты - PullRequest
0 голосов
/ 05 июня 2018
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;
    }

результат = всегда возвращать неправильные координаты,

пример = X = -1844, Y = 79,

X = -1556 Y = 271,

X = -1028 Y = 91

...

Значение меняется при каждом запуске

кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 05 июня 2018

Параметр 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);
}
...