HID-клавиатура: отправлять только клавиши-модификаторы

Я хочу отправлять клавиши-модификаторы, такие как Shift, Alt, Ctrl и т. д., без каких-либо других клавиш. Теоретически это должно быть возможно, поскольку оно работает на моей обычной клавиатуре (проверял с Xoutput и играми).

На данный момент мне нужно отправить фиктивные нажатия клавиш, такие как блокировка прокрутки (0xCF), чтобы отправить модификаторы. Я использую ядро Arduino для ESP32 с модулем разработки ESP32S3.

#include "USBHIDKeyboard.h" 
USBHIDKeyboard Keyboard;
Keyboard.press(KEY_LEFT_CTRL); Keyboard.write(0xCF); Keyboard.write(0xCF);
delay(1000);
Keyboard.release(KEY_LEFT_CTRL); Keyboard.write(0xCF); Keyboard.write(0xCF);

Это работает, но очень некрасиво: иногда мигает светодиод блокировки прокрутки, а в играх настройки иногда видят блокировку прокрутки и жалуются.

Есть идеи?

, 👍0


1 ответ


1

Вы можете использовать Keyboard.pressRaw(), модификаторами должны быть 0xE0–0xE8.

size_t USBHIDKeyboard::pressRaw(uint8_t k) {
  uint8_t i;
  if (k >= 0xE0 && k < 0xE8) {
    // это клавиша-модификатор
    _keyReport.modifiers |= (1<<(k-0x80));
  } else if (k && k < 0xA5) {
    // Добавляем k в ключевой отчет, только если его еще нет
    // и если есть пустой слот.
    if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && _keyReport.keys[2] != k && _keyReport.keys[3] != k && _keyReport.keys[4] != k && _keyReport.keys[5] != k) {
      for (i=0; i<6; i++) {
        if (_keyReport.keys[i] == 0x00) {
           _keyReport.keys[i] = k;
           break;
        }
      }
      if (i == 6) {
        return 0;
      }   
    }
  } else {
    // не модификатор и не ключ
    return 0;
  }
  sendReport(&_keyReport);
  return 1;
}

USBHIDKeyboard.cpp

,