目录

解决 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 Ctrl010000 0001
Left Shift120000 0010
Left Alt (Opt)240000 0100
Left Win (Cmd)380000 1000
Right Ctrl4160001 0000
Right Shift5320010 0000
Right Alt (Opt)6640100 0000
Right Win (Cmd)71281000 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 用户。