Raw Input API 怎么模拟键盘和鼠标的呢C++ 需要绕过消息机制 不用sendinput命令
在使用 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 函数模拟键盘和鼠标的操作。模拟键盘和鼠标的操作可以在任何时候进行,不需要绕过消息机制
原文地址: https://www.cveoy.top/t/topic/c2bQ 著作权归作者所有。请勿转载和采集!