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