在使用 Raw Input API 模拟键盘和鼠标之前,需要先注册输入设备。注册输入设备可以使用如下代码:

RAWINPUTDEVICE Rid[2];

// 注册键盘
Rid[0].usUsagePage = 0x01;
Rid[0].usUsage = 0x06;
Rid[0].dwFlags = RIDEV_NOLEGACY;   // 防止键盘消息被系统处理
Rid[0].hwndTarget = NULL;

// 注册鼠标
Rid[1].usUsagePage = 0x01;
Rid[1].usUsage = 0x02;
Rid[1].dwFlags = RIDEV_NOLEGACY;   // 防止鼠标消息被系统处理
Rid[1].hwndTarget = NULL;

if (!RegisterRawInputDevices(Rid, 2, sizeof(RAWINPUTDEVICE)))
{
    // 注册失败
}

注册成功后,就可以接收 Raw Input 消息。处理 Raw Input 消息可以使用如下代码:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_INPUT:
    {
        UINT dwSize = 0;
        GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
        LPBYTE lpb = new BYTE[dwSize];
        if (lpb == NULL)
        {
            return 0;
        }

        if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize)
        {
            // 处理错误
        }

        RAWINPUT* raw = (RAWINPUT*)lpb;

        if (raw->header.dwType == RIM_TYPEKEYBOARD)
        {
            // 处理键盘消息
        }
        else if (raw->header.dwType == RIM_TYPEMOUSE)
        {
            // 处理鼠标消息
        }

        delete[] lpb;
        break;
    }
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    return 0;
}

接收到 Raw Input 消息后,就可以模拟键盘和鼠标的操作了。模拟键盘和鼠标可以使用如下代码:

INPUT input;
ZeroMemory(&input, sizeof(INPUT));

// 模拟按下 A 键
input.type = INPUT_KEYBOARD;
input.ki.wVk = 'A';
SendInput(1, &input, sizeof(INPUT));

// 模拟释放 A 键
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(INPUT));

// 模拟鼠标移动
input.type = INPUT_MOUSE;
input.mi.dx = 100;  // 移动到 (100, 100)
input.mi.dy = 100;
input.mi.dwFlags = MOUSEEVENTF_MOVE;
SendInput(1, &input, sizeof(INPUT));

// 模拟鼠标左键按下
input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
SendInput(1, &input, sizeof(INPUT));

// 模拟鼠标左键释放
input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(1, &input, sizeof(INPUT));

以上代码中使用了 SendInput 函数模拟键盘和鼠标的操作。模拟键盘和鼠标的操作可以在任何时候进行,不需要绕过消息机制

Raw Input API 怎么模拟键盘和鼠标的呢C++ 需要绕过消息机制 不用sendinput命令

原文地址: https://www.cveoy.top/t/topic/c2bQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录