Почему моя скрытая клавиатура работает не очень хорошо?

#c #avr #hid #atmega #custom-keyboard

#c #avr #hid #atmega #пользовательская клавиатура

Вопрос:

Я только начал программировать свой ATmega8 с помощью V-USB link: https://www.obdev.at/products/vusb/index.html . Я пытаюсь сделать так, чтобы клавиатура witch нажимала CTRL ALT. Для этого я изменил одну из ссылок проекта «СКРЫТЫЕ клавиши»: https://www.obdev.at/products/vusb/hidkeys.html . Я добавил и изменил:

 //line 150, added definitions
#define KEY_DELETE 42
#define ALT_RIG    230 
#define ALT_LEF 226
#define CTRL_LEF    224
  

(У меня есть значения определений с этой стороны: https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf (со страницы 53))

 //line 204, modified code
static const uchar  keyReport[NUM_KEYS   1][2] PROGMEM = {
/* none */  {0, 0},                     /* no key pressed */
/*  1 */    {0, KEY_A},
/*  2 */    {0, KEY_B},
/*  3 */    {0, KEY_C},
/*  4 */    {0, KEY_D},
/*  5 */    {0, KEY_E},
/*  6 */    {0, KEY_F},
/*  7 */    {0, KEY_G},
/*  8 */    {0, KEY_H},
/*  9 */    {0, KEY_I},
/* 10 */    {0, 0},
/* 11 */    {0, 0},
/* 12 */    {MOD_CONTROL_LEFT, ALT_RIG}, //CTRL ALT
/* 13 */    {0, KEY_J},
/* 14 */    {0, KEY_K},
/* 15 */    {0, KEY_L},
/* 16 */    {0, KEY_M},
/* 17 */    {0, KEY_N},
};
  

По какой-то причине «нажатие» клавиш (CTRL ALT) с помощью uC (ATmega8) не работает. (Я проверяю это, одновременно нажимая (когда клавиши из uC (должны быть нажаты)) клавишу DEL на моей «истинной» клавиатуре — тогда должно появиться «характерное» окно управления системой (Windows 7).) Я понятия не имею, почему это не работает. Как я могу это сделать, чтобы мой uC нажимал CTRL ALT?

Ответ №1:

Дескриптор отчета в примере программы определяет 2-байтовый отчет для представления одного нажатия клавиши. Первый байт содержит 8 бит, каждый из которых представляет модификатор ключа (левый ctrl, правый alt, сдвиг влево и т.д.), А следующий байт — это индекс, представляющий использование ключа (клавиша A, клавиша B, клавиша Delete и т.д.).

Вам нужно логически ИЛИ желаемые ключевые модификаторы в первом байте. Самый простой способ — просто сложить их вместе. Например, для отправки Ctrl Alt Delete вы могли бы закодировать:

 {MOD_CONTROL_LEFT MOD_ALT_LEFT, KEY_DELETE}
  

Не забудьте впоследствии отправить {0, 0}, чтобы указать, что в данный момент не нажаты никакие клавиши.

Комментарии:

1. Это работает! Спасибо за помощь. Во время программирования мне приходит в голову одна вещь. Можно щелкнуть по всей последовательности CTRL ALT DEL, чтобы отобразить «синее» окно на ПК? Я пытался ее закодировать, но безрезультатно…

2. О, я написал неправильно. Я имею в виду, что ctrl alt работают (потому что, когда я нажимаю del на моей реальной клавиатуре, появляется синее окно), но вся последовательность ctrl alt del ( {MOD_CONTROL_LEFT MOD_ALT_LEFT, KEY_DELETE} ) не работает (синее окно не появляется). Более того, когда в коде есть только del ( {0, KEY_DELETE} ), кнопка del работает исправно. Только если в коде похоже {MOD_CONTROL_LEFT MOD_ALT_LEFT, KEY_DELETE} , что это не работает как «настоящие» ctrl alt delete. Я пробовал много модификаций этого кода, но это не работает. Что я могу с этим сделать?

3. Я подозреваю, что какая-то ошибка Windows, потому что, когда я говорю своей самодельной USB-клавиатуре отправить ctrl alt delete в мою систему Ubuntu 20.10 Linux, она ведет себя так, как ожидалось. Вы должны помнить, чтобы отпустить клавиши, отправив {0,0}, хотя — в противном случае ОС будет думать, что вы постоянно нажимаете эти клавиши.

4. Итак, я попробовал Win7, Win8, Win10, MS Server 2016 и новейшую Ubuntu, а ctrl alt del от uC не работает ни на одной из этих ОС. Я понятия не имею, почему она не работает. В любом случае, большое вам спасибо за помощь.