【问题标题】:WM_MOUSEMOVE GET_X_LPARAM AND GET_Y_LPARAM Catch wrong CoordinatesWM_MOUSEMOVE GET_X_LPARAM AND GET_Y_LPARAM 捕捉到错误的坐标
【发布时间】:2018-06-05 03:30:51
【问题描述】:
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;
    }

result = 总是返回错误的坐标,

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

X = -1556 Y = 271,

X = -1028 Y = 91

...

每次发布​​时价值都会发生变化

有人可以帮助我吗?

【问题讨论】:

  • 你有多少台显示器?
  • 我只有一台显示器
  • 您需要将 lParam 转换为 MOUSEHOOKSTRUCT 指针,因为您设置为 WH_MOUSE_LL。这个钩子类型安装钩子程序,回调中的lparam是数据结构的指针
  • msdn.microsoft.com/library/windows/desktop/… 你可以在 MSDN 中看到,在 MSDN 中,lparam 是“指向 MSLLHOOKSTRUCT 结构的指针。”

标签: c++ winapi hook mousemove


【解决方案1】:

MouseProc 的lParam 参数与WM_MOUSEMOVE 的lParam 参数不同。这是一个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);
}

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 2010-12-05
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2020-04-02
    相关资源
    最近更新 更多