2016-05-02 3 views
0

Он должен быть RAW вход прямо с устройства, это странно, что это зависит от следующих параметров:настройки клавиша повтора Windows, влияющие на входные сообщения Raw

enter image description here

Он не получит сообщение WM_INPUT до после задержки. Также на него влияет частота повторения. Я попытался также зарегистрировать исходное устройство ввода с флагом NO_LEGACY, без разницы. Это связано с приложением DirectX11. У меня такая проблема.

case WM_INPUT: {Input::handleInput(uMsg, wParam, lParam); break; } 
+0

* Key repeat * - это функция ОС, а не аппаратное обеспечение клавиатуры. Неудивительно, что «поддельный» вход синтезируется, и «SendInput» будет инструментом для этого. Входные пакеты, отправленные с 'SendInput', завершаются в той же входной очереди, что и пакеты из драйверов устройств. Неясно, какая у вас проблема. – IInspectable

ответ

0

Там нет никакого способа обойти это видимо, Gamedev учебник объяснило, что вы просто должны обрабатывать его в коде с вашим собственным извитым обходными. Сырье Введите мой Microsoft.

Что произойдет, когда вы нажмете и удерживаете клавишу WM_INPUT, отправит одно нажатие клавиши вниз, дождитесь окончания «повторной задержки ключа» Windows, а затем продолжите отправку ключевых сообщений по настройке «повторная скорость клавиатуры Windows».

Я обнаружил, что вместо использования члена Makecode или Vkey проще использовать элемент keyboard.flags, потому что (для большинства ключей), когда ключ выключен, этот флаг будет равен нулю, а когда он будет установлен флаг будет установлен в 1, так что вы можете просто переверните его:

switch (mpRawInput->data.keyboard.VKey) 
     { 
     case VK_W: Input::mIsKeyDown[VK_W] = !mpRawInput->data.keyboard.Flags; break; 
     case VK_A: Input::mIsKeyDown[VK_A] = !mpRawInput->data.keyboard.Flags; break; 
     case VK_S: Input::mIsKeyDown[VK_S] = !mpRawInput->data.keyboard.Flags; break; 
     case VK_D: Input::mIsKeyDown[VK_D] = !mpRawInput->data.keyboard.Flags; break; 
     case VK_SPACE: Input::mIsKeyDown[VK_SPACE] = !mpRawInput->data.keyboard.Flags; 
     }  

Использование keyboard.flag 0 или 1 значение означает, что при нажатии на клавишу вы получите сообщение флаг 0, так что вы отправить противоположное что для «isKeyDown» bool. Когда эта клавиша будет поднята, флаг будет установлен на 1.

Для ключей других ключей вам потребуются обходные пути, например, клавиши со стрелками имеют значение флага 3, когда функция num lock включена, и нормально, когда она выключена. Другие клавиши ведут себя совершенно иначе, как «Print Screen» и «Pause/Break». Какой полный беспорядок.

 Смежные вопросы

  • Нет связанных вопросов^_^