Есть ли способ вручную отправлять сообщения на USB-клавиатуру под Windows? - PullRequest
0 голосов
/ 10 ноября 2019

Я работаю над личным проектом, который включает MCU - связь с Windows. MCU настроен для работы в качестве HID-клавиатуры (без последовательного соединения).

После прочтения Спецификации OS Dev HID , а также пары вопросов здесь, в стеке, я заметил, что мойMCU может обнаружить, если на моем компьютере не запущено ни одно программное обеспечение, когда нажата блокировка заглавных букв (предположительно, работает для всех остальных «светодиодных клавиш»). Поэтому, когда я нажимаю Caps Lock, на моем MCU включается светодиод.

Чтобы установить светодиодные лампы, драйвер отправляет запрос SetReport на устройство, используя стандартную транзакцию настройки USB, с однобайтовым байтом. этап данных. Тип запроса установочного пакета должен содержать 0x21, код запроса для SetReport - 0x09. Поле значения пакета установки содержит идентификатор отчета в младшем байте, который должен быть нулевым. Старший байт содержит тип отчета, который должен быть 0x02, чтобы указать выходной отчет, или отчет, который отправляется из программного обеспечения в аппаратное обеспечение. Поле индекса должно содержать номер интерфейса USB-клавиатуры, то есть номер, присутствующий в дескрипторе интерфейса, который указывает, что это устройство вообще было USB-клавиатурой. Этап данных должен составлять 1 байт, что является битовым полем. Эта транзакция установки должна быть передана на нулевую конечную контрольную точку, которая будет работать на всем оборудовании. Другое оборудование может поддерживать или не поддерживать дополнительную конечную точку OUT прерывания. Если оборудование поддерживает конечную точку OUT прерывания, вы можете просто перенести 1-байтовый этап данных в конечную точку OUT прерывания без дополнительных затрат на этапе SETUP и этапе STATUS. Если аппаратное обеспечение поддерживает конечную точку OUT прерывания, следует избегать конечной точки управления, когда это возможно, поскольку конечная точка OUT прерывания является более быстрой и может быть запрограммирована с передачей прерываний вместо передач настройки. Формат 1-байтовой стадии данных (для транзакции SETUP) или 1-байтовой передачи OUT прерывания показан ниже. Когда бит установлен в 1, соответствующий светодиод включается.

Мне интересно, можно ли было бы вручную отправить сообщение на MCU, точно так же, как мигание светодиода работает, нос моим собственным содержанием. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 10 ноября 2019

Вы можете использовать SendInput для переключения состояния caps lock (или num lock) следующим образом:

INPUT inputs[2] = {};

const WORD wScanCodeCapsLock = 0x3a;
const WORD wScanCodeNumLock = 0x45;

inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wScan = wScanCodeCapsLock;
inputs[0].ki.dwFlags = KEYEVENTF_SCANCODE;
inputs[0].ki.time = 1;

inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wScan = wScanCodeCapsLock;
inputs[1].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
inputs[1].ki.time = 100;
SendInput(2, inputs, sizeof(INPUT));

Проверьте этот ответ здесь , чтобы узнать, какопределить текущее состояние этих ключей.

...