目录

解决 MCHOSE 机械键盘 ⌨️ 网页驱动的组合键设计问题

TL;DR
  • 网页驱动 UI 只让选一个修饰键,但底层实现是 bitmask,支持叠加多个。
  • 导出配置 → 手动修改 code1 → 导入回去即可。
  • 勿扰键 HID 用法不在内置集合里,无法直接下发,只能走系统自定义快捷键绕过。
  • 我们没有给出完整可以立即操作的方案,但是读者读完本文应该能明白思路并自己动手完成。

背景与目标

近年来国产机械键盘的竞争似乎非常激烈,「卷」出来了不少不错的产品。笔者虽然不用键盘打游戏,但是日常工作的打字需求还是很多的。尤其是在有 LLM 之后,工作效率和打字速度相关性更高了。所以在每个可能工作的地方都放一把机械键盘还是很有必要的。最近添置了一把 MCHOSE 迈从 G87 V2, 把旧的键盘拿去替换工位的薄膜键盘了。买这把键盘之前没做什么调查,但是拿到手里之后感觉质感相当不错。

https://image.ne0.io/2025-12-17-14-26-19.jpg
换了一套流浪地球主题的键帽,原装的不是很好看

不过实际使用的时候,倒是发现键位设计不是很顺手。F 区的默认的设置,大部分按键都是和我这台 MacBook 自带键盘是一样的,但有三个键不同:

  • F3 不是打开调度中心,而是 Command + Tab
  • F4 不是 Spotlight 而是显示桌面;
  • F6 不是切换勿扰模式而是截图 Command + Shift + 3.

另外,PrintScreen 发送的是一个 F13 按键,这个按键在现代键盘上没有实际的意义。

我们希望的是,能在不同的设备之间尽可能地保持一致性,所以希望把 F3F4F6 改成和 MacBook 自带键盘一样,把 PrintScreen 改成截图。

网页驱动的问题

F3F4 的问题很容易修正:直接用迈从自家的网页端驱动,把 F3 改成组合键 Control + ↑ 就行了,而 Spotlight 也有预先提供的按键定义。另外,因为 Menu 键没有什么用,笔者把它改成了 RightOption.

一般来说,我们可能会期望,像之前一样把 PrintScreen 一样地改成某个截图的快捷键就行了(比如 F6 原本对应的 Command + Shift + 3),但是发现这个网页驱动不仅没有提供这个原本就有的按键,而且组合键的修饰键只允许设置一个键。而 macOS 的截图快捷键 Command + Shift + 3/4/5 至少也需要两个修饰键。

https://image.ne0.io/2025-12-17-14-39-35.png
组合键的修饰键居然只允许设置一个键

逆向:导出 JSON 与对照修改

为了解决这个问题,我们可以去翻这个驱动的源代码:网页端的最大好处就是它的逻辑都是用 JavaScript 写的,源代码都是直接暴露给用户的。(而且我们也不是第一次做这种事了)

首先导出查看键位配置的 json 文件,显而易见的是这个文件里会包含全部键位映射的信息。对比有修改和无修改的配置,定位到以下这一段是已经修改过的按键。我们可以确定,键值 24, 32, 93 是分别对应了 F3, F4, Menu 这三个按键。

https://image.ne0.io/2025-12-17-15-50-53.png

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

https://image.ne0.io/2025-12-17-15-47-45.png

看到这段源码就可以确定,我们已经定义了映射的 F3 (24) 和 Menu (93) 的 type === 16, 是一种带修饰键的组合键:code1 表示修饰键,code2表示被修饰的主键。而且 code1 是一个 8-bit 的 bitmask, 可以表示多个修饰键的组合。上文中提到的组合键只能有一个修饰键的问题,实际只是前端写得有问题而已。F4 (32) 的 type === 48 则是另一种类型。另外,这些数字与按键之间的映射关系,也是在 js 源码里找到的,但是这里不展开讲了。

type === 16 的 bitmask 定义非常标准,它定义在 code1 上:

  • ALTcode1 >> 2(左 Alt)或 code1 >> 6(右 Alt)
  • SHIFTcode1 >> 1(左 Shift)或 code1 >> 5(右 Shift)
  • CTRLcode1 >> 0(左 Ctrl)或 code1 >> 4(右 Ctrl)
  • WINcode1 >> 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 = 10
  • Command + Option:8 + 4 = 12

笔者选择定义了 PrintScreenCommand + 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 用户。