В настоящее время я использую API RawInput из 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;
Что-то не так?
Вы устанавливаете RIDEV_NOLEGACY
флаг. Это отключает устаревшие сообщения мыши.
Следовательно, процедура окна по умолчанию не получает сообщения мыши. Таким образом, он не может переместить ваше окно или реагировать на нажатия кнопок или что-то еще. Что вы видите.
Других решений пока нет …