自定义 HID 键盘的键盘输入报告中的多个修饰符 (2)

Jos*_*ohn 1 keyboard usb keymapping hid

我正在构建一个宏键盘,我尝试实现的功能之一是 Ctrl+Shift+R,但在定义中,固定 8 字节字符串中仅存在一个修饰符。如何实施额外的修饰符?

aja*_*aja 5

USB 键盘几乎总是有一个 HID 报告描述符,它定义每个入站键盘报告,如下所示:

Bit:        7   6   5   4   3   2   1   0
          +---+---+---+---+---+---+---+---+
Byte 0    | RG| RA| RS| RC| LG| LA| LS| LC|  Modifier bits (LC=Left Control, LS= Left Shift, etc)
          +---+---+---+---+---+---+---+---+
Byte 1    |        Reserved byte          |
          +---+---+---+---+---+---+---+---+
Byte 2    |        Key 1                  |
          +---+---+---+---+---+---+---+---+
Byte 3    |        Key 2                  |
          +---+---+---+---+---+---+---+---+
Byte 4    |        Key 3                  |
          +---+---+---+---+---+---+---+---+
Byte 5    |        Key 4                  |
          +---+---+---+---+---+---+---+---+
Byte 6    |        Key 5                  |
          +---+---+---+---+---+---+---+---+
Byte 7    |        Key 6                  |
          +---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

每个修饰键都表示为字节 0 中的单个位。要指示按下多个修饰键,您可以将这些值“或”在一起。你可以编写如下代码:

#define MOD_LEFT_CONTROL 0b00000001
#define MOD_LEFT_SHIFT   0b00000010
#define MOD_LEFT_ALT     0b00000100
.
.
#define KEY_R            0x15
.
.
modifiers = MOD_LEFT_CONTROL | MOD_LEFT_SHIFT;
reserved = 0;
key[0] = KEY_R;
Run Code Online (Sandbox Code Playgroud)

可以定义一个 HID 报告描述符,允许将修改键用法包含在 6 字节键数组中,但通常不需要这样做 - 并且上述方案无论如何使用更少的空间。