Windows опрашивает аппаратное обеспечение клавиатуры за кадром. Когда происходят ключевые события, он добавляет соответствующие сообщения WM_ * в вашу очередь сообщений Windows (со связанной информацией о состоянии клавиатуры). Windows Message Pump *1002* извлекает эти сообщения из очереди и обрабатывает их соответствующим образом. Основным преимуществом этого подхода является то, что вам действительно не нужно много делать, чтобы заполучить события клавиатуры (плюс знание знания раскладки клавиатуры / аппаратного обеспечения не требуется). Недостатком является то, что на самом деле это не в режиме реального времени.
Разговор с клавиатурой через DirectInput на самом деле аналогичен, но вы должны сделать опрос. Обычно вы используете DirectInput для настройки устройства клавиатуры, а затем при каждом запуске цикла обновления вы опрашиваете состояние клавиатуры, используя GetDeviceState () . Это зависит от вас, чтобы отслеживать состояние клавиатуры между опросами. Лучше всего создать объект, который обернет эту функциональность и, возможно, запустит события / обратные вызовы или создаст запись команды в очереди в подходящее время, чтобы с ней было удобнее работать. Преимущество этого метода заключается в скорости, поскольку вы напрямую общаетесь с оборудованием и можете мгновенно вызывать обновления. Недостатком является то, что вы должны делать это вручную, что занимает немного времени для настройки и получения правильных результатов.
Посмотрите этот пример о том, как использовать DirectInput для запроса клавиатуры.
Итак, есть несколько ответов на ваш вопрос:
- Если у вас уже есть сообщения WM_ *, почему бы просто не вызвать код, который будет вызывать обработка DirectInput, что даст вам те же функциональные возможности?
- DirectInput посредством опроса предоставляет вам ту же информацию, что Windows предоставляет вам через сообщения WM_ *. Так что вам не нужно конвертировать или пытаться сопоставить одно с другим. Просто проверьте состояние ключей и обработайте случаи, когда состояние меняется.
- Выберите один метод и откажитесь от другого. Они оба делают одно и то же. Я бы порекомендовал использовать DirectInput, если вы хотите скорость и отзывчивость. Если это не так важно, используйте сообщения WM_ *.
Надеюсь, это поможет. Удачи!