0

我正在尝试制作一个仅检测是否按住鼠标左键的应用程序。为了做到这一点,以及学习鼠标钩子,我从示例源(https://cboard.cprogramming.com/windows-programming/119909-setwindowshookex-lowlevelmouseproc.html)复制粘贴了一个钩子,只是为了看看会的。问题是它落后于我的电脑。为什么会这样,我该如何解决?

#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <iostream>
#include <cstdio>
using namespace std;

HHOOK g_Hook;
HANDLE g_evExit;

LRESULT CALLBACK LowLevelMouseProc (int code, WPARAM wParam, LPARAM lParam)
{
    if (code == HC_ACTION)
    {
        const char *msg;
        char msg_buff[128];
        switch (wParam)
        {
            case WM_LBUTTONDOWN: msg = "WM_LBUTTONDOWN"; break;
            case WM_LBUTTONUP: msg = "WM_LBUTTONUP"; break;
            case WM_RBUTTONDOWN: msg = "WM_RBUTTONDOWN"; break;
            case WM_RBUTTONUP: msg = "WM_RBUTTONUP"; break;
            default: 
                sprintf(msg_buff, "Unknown msg: %u", wParam); 
                msg = msg_buff;
                break;
        }//switch

        const MSLLHOOKSTRUCT *p = 
            reinterpret_cast<const MSLLHOOKSTRUCT*>(lParam);
        cout << msg << " - [" << p->pt.x << ',' << p->pt.y << ']' << endl;

        static bool left_down = false;
        static bool right_down = false;
        switch (wParam)
        {
            case WM_LBUTTONDOWN: left_down = true; break;
            case WM_LBUTTONUP:   left_down = false; break;
            case WM_RBUTTONDOWN: right_down = true; break;
            case WM_RBUTTONUP:   right_down = false; break;
        }//switch

        if (left_down && right_down)
            SetEvent(g_evExit);
    }//if

    return CallNextHookEx(g_Hook, code, wParam, lParam); 
}//LowLevelMouseProc


int main()
{
    g_evExit = CreateEvent(0, TRUE, FALSE, 0);
    if (!g_evExit)
    {
        cerr << "CreateEvent failed, le = " << GetLastError() << endl;
        return 1;
    }//if

    g_Hook = SetWindowsHookEx(WH_MOUSE_LL, &LowLevelMouseProc, 
                              GetModuleHandle(0), 0);
    if (!g_Hook)
    {
        cerr << "SetWindowsHookEx() failed, le = " << GetLastError() << endl;
        return 1;
    }//if

    cout << "Press both left and right mouse buttons to exit..." << endl;

    MSG msg;
    DWORD status;
    while (1)
    {
        while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
            DispatchMessage(&msg);

        status = MsgWaitForMultipleObjects(1, &g_evExit, FALSE, 
                                           INFINITE, QS_ALLINPUT);
        if (status == (WAIT_OBJECT_0 + 1))
        {
            // there are messages to process, eat em up
            continue;
        }//if
        else
        {
            // assume g_evExit is signaled
            break;
        }//else
    }//while

    cout << "Exiting..." << endl;
    UnhookWindowsHookEx(g_Hook);
    CloseHandle(g_evExit);
    return 0;
}//main
4

0 回答 0