5

我想将 Mac Eject Key 重新映射到 Insert 中,特别是用于模拟 Windows 应用程序中的 Ctrl+Insert、Alt+Insert、Shift+Insert 和其他常用组合键。

弹出键的虚拟键代码是什么?我找到了一些虚拟密钥表,但由于某种原因,从未包含 Eject Key。

4

2 回答 2

1

问:Mac 中哪个是弹出键的虚拟键?

答:没有。

参考通用串行总线的 HID 使用表,弹出不是按键,实际上是 HID 使用 - 来自消费者使用页面的一次性控件。

3.4.1.4 单次控制 (OSC)
单次控制是触发单个事件或动作的按钮。One Shot Control 被编码为 1 位值,并声明为相对、首选、主要项目,其逻辑最小值和逻辑最大值分别为 0 和 1。从 0 到 1 的转换会启动一个事件。从 1 到 0 的转换不会发生任何事情,但在另一个事件发生之前需要它。一个例子是消磁。

在消费者使用页面 (0x0C) 上,弹出使用 ID 定义为:

使用 ID 使用名称 使用类型 部分
B8 喷射 操作系统 15.7

如果您想从支持 USB HID 的 Arduino(例如 Leonardo)伪造 Eject 按键,您可以使用以下代码来执行此操作,该代码发送 Control-Shift-Eject 以锁定屏幕...

// NicoHood's HID-Project
#include "HID-Project.h"

void setup() {
  // Make pin 2 an input and turn on the pull-up resistor
  // so it goes high unless connected to ground:
  pinMode(2, INPUT_PULLUP);

  Keyboard.begin();

  // Sends a clean report to the host.
  // This is important on any Arduino type.
  Consumer.begin();
}

void loop() {
  // Control-Shift-Eject locks the screen
  if (digitalRead(2) == LOW) {
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press(KEY_LEFT_SHIFT);

    // This is a One Shot Command so doesn't need a "release"
    Consumer.write(HID_CONSUMER_EJECT);

    // Debounce
    delay(100);
    while (digitalRead(2) == LOW)
      delay(100);

    // Release Control-Shift keys
    Keyboard.releaseAll();
  }
}

至于对来自 Windows 的 Eject 按键做出反应,除非它作为与媒体控制相关的 WM_ 事件之一引发,否则我希望您必须编写一个 USB HID/ACPI 驱动程序来检测并引发 OSC 本身。

ACPI 中有适用于运行 Windows 10 桌面版的设备的示例按钮,该按钮演示了如何从消费者页面捕获其他一些 OSC(例如 Volume Increments/Decrements),您可能可以对此进行扩展以包括 Eject。

抱歉,我无法提供更多帮助,但希望这能为您指明正确的方向。

于 2021-01-06T12:49:45.580 回答
0

我知道这个问题是几年前提出的,但也许有些人仍在寻找那个答案,最终会找到那个问题,所以......

VoodooPS2Keyboard.cpp来自RehabMan的 VoodooPS2Controller 的第 1805行说 Mac 上用于 Eject Key 的虚拟键是0x92.

参考:

https://github.com/RehabMan/OS-X-Voodoo-PS2-Controller/blob/master/VoodooPS2Keyboard/VoodooPS2Keyboard.cpp

于 2016-12-14T17:57:00.537 回答