首页 > 解决方案 > 如何在鼠标钩子进程中发送鼠标输入时避免延迟?

问题描述

这是我的代码:

#include <Windows.h>

void InputRButtonDown()
{
    INPUT inp;
    inp.type = INPUT_MOUSE;
    inp.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;

    SendInput(1, &inp, sizeof(INPUT));
}

void InputRButtonUp()
{
    INPUT inp;
    inp.type = INPUT_MOUSE;
    inp.mi.dwFlags = MOUSEEVENTF_RIGHTUP;

    SendInput(1, &inp, sizeof(INPUT));
}

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0)
    {
        WORD button;
        switch (wParam)
        {
        case WM_LBUTTONDOWN:
            break;

        case WM_LBUTTONUP:
            break;

        case WM_RBUTTONDOWN:
            break;

        case WM_RBUTTONUP:
            break;

        case WM_XBUTTONDOWN:
            button = HIWORD(((MSLLHOOKSTRUCT*)lParam)->mouseData);
            if (button == XBUTTON2) {
                InputRButtonDown();
            }
            break;

        case WM_XBUTTONUP:
            button = HIWORD(((MSLLHOOKSTRUCT*)lParam)->mouseData);
            if (button == XBUTTON2) {
                InputRButtonUp();
            }
            break;
        }
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main()
{
    SetWindowsHookExW(WH_MOUSE_LL, MouseProc, NULL, 0);

    MSG msg;
    while (GetMessageW(&msg, NULL, 0, 0) != NULL) {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }
}

当我单击鼠标侧键之一时,它应该模拟右键单击。问题是鼠标右键单击会在短暂延迟(约 400 毫秒)后触发,而不是立即触发。如果我修改此代码以调用InputRButton...键盘挂钩 proc 而不是鼠标挂钩 proc 中的函数,则它可以毫无延迟地工作。我的错误在哪里以及如何解决?

标签: c++winapi

解决方案


推荐阅读