解决 MCHOSE 机械键盘 ⌨️ 网页驱动的组合键设计问题
- 网页驱动 UI 只让选一个修饰键,但底层实现是 bitmask,支持叠加多个。
- 导出配置 → 手动修改 code1 → 导入回去即可。
- 勿扰键 HID 用法不在内置集合里,无法直接下发,只能走系统自定义快捷键绕过。
- 我们没有给出完整可以立即操作的方案,但是读者读完本文应该能明白思路并自己动手完成。
背景与目标
近年来国产机械键盘的竞争似乎非常激烈,「卷」出来了不少不错的产品。笔者虽然不用键盘打游戏,但是日常工作的打字需求还是很多的。尤其是在有 LLM 之后,工作效率和打字速度相关性更高了。所以在每个可能工作的地方都放一把机械键盘还是很有必要的。最近添置了一把 MCHOSE 迈从 G87 V2, 把旧的键盘拿去替换工位的薄膜键盘了。买这把键盘之前没做什么调查,但是拿到手里之后感觉质感相当不错。

不过实际使用的时候,倒是发现键位设计不是很顺手。F 区的默认的设置,大部分按键都是和我这台 MacBook 自带键盘是一样的,但有三个键不同:
F3不是打开调度中心,而是Command + Tab;F4不是 Spotlight 而是显示桌面;F6不是切换勿扰模式而是截图Command + Shift + 3.
另外,PrintScreen 发送的是一个 F13 按键,这个按键在现代键盘上没有实际的意义。
我们希望的是,能在不同的设备之间尽可能地保持一致性,所以希望把 F3、F4 和 F6 改成和 MacBook 自带键盘一样,把 PrintScreen 改成截图。
网页驱动的问题
F3 和 F4 的问题很容易修正:直接用迈从自家的网页端驱动,把 F3 改成组合键 Control + ↑ 就行了,而 Spotlight 也有预先提供的按键定义。另外,因为 Menu 键没有什么用,笔者把它改成了 RightOption.
一般来说,我们可能会期望,像之前一样把 PrintScreen 一样地改成某个截图的快捷键就行了(比如 F6 原本对应的 Command + Shift + 3),但是发现这个网页驱动不仅没有提供这个原本就有的按键,而且组合键的修饰键只允许设置一个键。而 macOS 的截图快捷键 Command + Shift + 3/4/5 至少也需要两个修饰键。

逆向:导出 JSON 与对照修改
为了解决这个问题,我们可以去翻这个驱动的源代码:网页端的最大好处就是它的逻辑都是用 JavaScript 写的,源代码都是直接暴露给用户的。(而且我们也不是第一次做这种事了)
首先导出查看键位配置的 json 文件,显而易见的是这个文件里会包含全部键位映射的信息。对比有修改和无修改的配置,定位到以下这一段是已经修改过的按键。我们可以确定,键值 24, 32, 93 是分别对应了 F3, F4, Menu 这三个按键。

知道了数据格式,我们去翻网页的 js 源码,直接搜索 code1, 找到了下面这一段:

看到这段源码就可以确定,我们已经定义了映射的 F3 (24) 和 Menu (93) 的 type === 16, 是一种带修饰键的组合键:code1 表示修饰键,code2表示被修饰的主键。而且 code1 是一个 8-bit 的 bitmask, 可以表示多个修饰键的组合。上文中提到的组合键只能有一个修饰键的问题,实际只是前端写得有问题而已。F4 (32) 的 type === 48 则是另一种类型。另外,这些数字与按键之间的映射关系,也是在 js 源码里找到的,但是这里不展开讲了。
type === 16 的 bitmask 定义非常标准,它定义在 code1 上:
ALT:code1 >> 2(左 Alt)或code1 >> 6(右 Alt)SHIFT:code1 >> 1(左 Shift)或code1 >> 5(右 Shift)CTRL:code1 >> 0(左 Ctrl)或code1 >> 4(右 Ctrl)WIN:code1 >> 3(左 Win)或code1 >> 7(右 Win)
改成二进制格式就是:
| 修饰键 | bit 位置 | 十进制 | 二进制 |
|---|---|---|---|
| Left Ctrl | 0 | 1 | 0000 0001 |
| Left Shift | 1 | 2 | 0000 0010 |
| Left Alt (Opt) | 2 | 4 | 0000 0100 |
| Left Win (Cmd) | 3 | 8 | 0000 1000 |
| Right Ctrl | 4 | 16 | 0001 0000 |
| Right Shift | 5 | 32 | 0010 0000 |
| Right Alt (Opt) | 6 | 64 | 0100 0000 |
| Right Win (Cmd) | 7 | 128 | 1000 0000 |
macOS 的
Command就是 Windows 的Win,Option就是Alt.
通过这个我们就能知道常见组合键对应的 code1 数值:
Command + Shift:8 + 2 = 10Command + Option:8 + 4 = 12
笔者选择定义了 PrintScreen 为 Command + Shift + 4(区域截图):手动修改 json 配置文件,然后从网页端导入即可:"104": {"type": 16, "code1": 10, "code2": 33}.
最后,关于勿扰模式,经过笔者的调研,发现 MacBook 键盘上的切换勿扰模式的 🌛 按键实际发送的是 “Generic Desktop” 页(0x01)下的 “System Do Not Disturb” 用法 ID(0x9B,合起来常写作 0x0001009B)。这个键盘驱动只支持发送预先定义好的按键,而这个并未被包含,于是只能作罢。这个实际上也可以通过在系统里自定义一个切换勿扰模式的快捷键,然后把 F6 也定义成这个组合键来实现。
总结
结论是这样:
- 网页驱动的 UI 是残缺的,导致无法定义多个修饰键,但是可以通过修改配置文件来绕过。
- 网页驱动只能下发它内置的按键集合,而 System Do Not Disturb (0x0001009B) 不在其中,所以我们不能把
F6直接定义成切换勿扰模式。
希望这篇简单的逆向笔记能帮到同样使用 MCHOSE 键盘的 macOS 用户。