В настоящее время я использую RawInput API из Windows, чтобы получить доступ к вводу с клавиатуры и мыши. Одна вещь, которую я немного смущаю, это то, что когда я регистрирую свою мышь как RawInputDevice
, я не могу перемещать окно Win32 или использовать элементы управления там (закрыть, свернуть и т. д.). Вместо этого я получаю курсор значка загрузки. Это нормальное поведение? Вот как я регистрирую свое устройство:
RAWINPUTDEVICE Rid[2];
Rid[0].usUsagePage = 0x01;
Rid[0].usUsage = 0x02;
Rid[0].dwFlags = RIDEV_NOLEGACY; // adds HID mouse and also ignores legacy mouse messages
Rid[0].hwndTarget = windowHandle;
Rid[1].usUsagePage = 0x01;
Rid[1].usUsage = 0x06;
Rid[1].dwFlags = RIDEV_NOLEGACY; // adds HID keyboard and also ignores legacy keyboard messages
Rid[1].hwndTarget = windowHandle;
if (RegisterRawInputDevices(Rid, 2, sizeof(Rid[0])) == FALSE) {
// smth went wrong.
}
И вот как я обрабатываю случай WM_INPUT
:
case WM_INPUT:
char buffer[sizeof(RAWINPUT)] = {};
UINT size = sizeof(RAWINPUT);
GetRawInputData(reinterpret_cast<HRAWINPUT>(lParam), RID_INPUT, buffer, &size, sizeof(RAWINPUTHEADER));
RAWINPUT* raw = reinterpret_cast<RAWINPUT*>(buffer);
if (raw->header.dwType == RIM_TYPEMOUSE || raw->header.dwType == RIM_TYPEKEYBOARD) {
inputManager.processMessage(*raw);
}
break;
Здесь что-то не так?