我想将 Mac Eject Key 重新映射到 Insert 中,特别是用于模拟 Windows 应用程序中的 Ctrl+Insert、Alt+Insert、Shift+Insert 和其他常用组合键。
弹出键的虚拟键代码是什么?我找到了一些虚拟密钥表,但由于某种原因,从未包含 Eject Key。
问: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。
抱歉,我无法提供更多帮助,但希望这能为您指明正确的方向。
我知道这个问题是几年前提出的,但也许有些人仍在寻找那个答案,最终会找到那个问题,所以......
VoodooPS2Keyboard.cpp
来自RehabMan的 VoodooPS2Controller 的第 1805行说 Mac 上用于 Eject Key 的虚拟键是0x92
.
参考: