C++ 使用 Raw Input API 接收鼠标和键盘数据
在 C++ 中,可以使用 Raw Input API 接收鼠标和键盘数据。以下是一个简单的示例代码,可以接收键盘输入并输出到控制台:
#include <Windows.h>
int main()
{
RAWINPUTDEVICE Rid[1];
Rid[0].usUsagePage = 0x01;
Rid[0].usUsage = 0x06;
Rid[0].dwFlags = RIDEV_INPUTSINK;
Rid[0].hwndTarget = NULL;
if (!RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])))
{
return 1;
}
while (true)
{
MSG msg;
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
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)
{
delete[] lpb;
return 0;
}
RAWINPUT* raw = (RAWINPUT*)lpb;
if (raw->header.dwType == RIM_TYPEKEYBOARD)
{
if (raw->data.keyboard.Flags == RI_KEY_MAKE)
{
printf('%c', MapVirtualKey(raw->data.keyboard.VKey, MAPVK_VK_TO_CHAR));
}
}
delete[] lpb;
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
在上面的代码中,首先使用RegisterRawInputDevices函数注册一个 RAWINPUTDEVICE,表示我们要接收键盘输入。然后,在一个无限循环中使用GetMessage函数获取消息,并使用TranslateMessage和DispatchMessage函数将消息传递给窗口过程函数WndProc。
在WndProc函数中,如果收到WM_INPUT消息,就使用GetRawInputData函数获取 RAWINPUT 数据,并判断它是否是键盘输入。如果是键盘输入,就将键盘码转换为字符并输出到控制台。
原文地址: https://www.cveoy.top/t/topic/ngmG 著作权归作者所有。请勿转载和采集!