C++ WM_MOUSEMOVE GET_X_LPARAM和GET_Y_LPARAM捕捉错误的坐标 LRESULT回调MouseProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM) { 如果(nCode==HC\U动作) { if(wParam==WM\u MOUSEMOVE) { cout

C++ WM_MOUSEMOVE GET_X_LPARAM和GET_Y_LPARAM捕捉错误的坐标 LRESULT回调MouseProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM) { 如果(nCode==HC\U动作) { if(wParam==WM\u MOUSEMOVE) { cout,c++,winapi,hook,mousemove,C++,Winapi,Hook,Mousemove,MouseProc的lParam参数与WM\u MOUSEMOVE的lParam参数不同。它是一个MOUSEHOOKSTRUCT* 因此,将MouseProc更改为: LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION) { if (wParam == WM_MOUSEMOVE) { cout

MouseProc的
lParam
参数与
WM\u MOUSEMOVE
lParam
参数不同。它是一个
MOUSEHOOKSTRUCT*

因此,将
MouseProc
更改为:

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;
    }
LRESULT回调MouseProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
如果(nCode==HC\U动作)
{
auto&ms=*(const MOUSEHOOKSTRUCT*)lParam;
if(wParam==WM\u MOUSEMOVE)
{

您有多少个监视器?我只有一个监视器。您需要将lParam转换为MOUSEHOOKSTRUCT指针,因为您设置为WH_MOUSE_LL。这个钩子类型的安装钩子过程,回调中的lParam是数据结构的指针,您可以在MSDN中看到,在MSDN中,lParam是“指向MSLLHOOKSTRUCT结构的指针”
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);
}