RigZeeel/KeyAxis

GitHub: RigZeeel/KeyAxis

通过逆向磁轴键盘的私有 HID 行程协议,将按键按压深度实时映射为虚拟 Xbox 手柄的模拟轴,使廉价键盘变为可用的赛车模拟踏板。

Stars: 0 | Forks: 0

KeyAxis # KeyAxis **将廉价的磁轴键盘变成真正的模拟赛车踏板。** 按下一半 W 键,汽车会缓慢爬行。按到底,就是全油门。 无需厂商软件,无需额外硬件,无需浏览器。 [![License: MIT](https://img.shields.io/badge/License-MIT-ff5a3c.svg)](LICENSE) ![Platform](https://img.shields.io/badge/platform-Windows%2010%2F11-4aa8ff) ![Status](https://img.shields.io/badge/BeamNG-confirmed%20working-3ddc84)
## 这支持我的键盘吗? **仅当 Windows 将其显示为 `VID 0416` / `PID 7372` 时有效。** 这包括 Redragon M68 / E-YOOSO HZ-68,以及同一主板更换品牌后的各种衍生名称。 检查方法:设备管理器 → 键盘 → 你的键盘 → 详细信息 → *硬件 ID*。 你需要找到 `HID\VID_0416&PID_7372`。 | 主板 | VID | PID | 状态 | |-------|-----|-----|--------| | Redragon M68 / E-YOOSO HZ-68 | `0x0416` | `0x7372` | ✅ 验证可用 | | *你的主板在这里* | — | — | [欢迎贡献](#adding-your-own-board) | 其他磁轴键盘(Wooting、Keychron、其他 Sinowealth 芯片)各自使用 其专有的通信协议,**无法直接使用** —— 但设备层是 可插拔的,因此添加新设备是一项相对独立的工作。详见下文。 ## 为什么会有这个项目 磁轴("Hall-effect" / 霍尔效应)键盘不仅知道按键被按下 —— 它们还知道 **按键确切按下了多深**,大约在 0 到 4 毫米之间,分为 40 个步进。这完全满足了 油门踏板所需的一切条件。 该键盘将这些数据锁在内部,只使用只有厂商的网页配置工具才能听懂的私有协议进行通信。KeyAxis 的原理是对该通信进行“窃听”,破解其“常用语手册”,然后直接向键盘询问同样的问题。它会读取原始的约 1000 Hz 行程数据流,应用你设置的 死区和响应曲线,并将其馈送给**虚拟 Xbox 控制器**,而所有游戏都已经知道如何与之交互。 目前没有其他工具能在该键盘上实现这一点。 ## 安装说明 ### 简单方法 从 [Releases](../../releases) 下载 **`KeyAxis-Setup.exe`**。它会安装 应用程序,提示安装 ViGEmBus 驱动,并应用针对 Game Bar 弹窗的修复。 无需 Python。 ### 从源码安装 ``` python -m pip install -r requirements.txt python app.py ``` 或者直接双击 **`KeyAxis.bat`**,它会在首次运行时自动安装依赖项。 **系统要求:** Windows 10/11 64 位、Python 3.9+(仅源码运行需要),以及用于踏板输出的 [ViGEmBus 驱动](https://github.com/nefarius/ViGEmBus/releases)。Monitor 选项卡无需 ViGEmBus 即可工作。 ## 快速入门 1. **连接** —— 插入键盘,点击“连接”。 2. **校准一次**(约 1 分钟)—— 向导会学习每个按键对应的物理开关以及其实际最大按下深度。数据将永久保存,即使重装也会保留。 3. **绑定踏板** —— 点击 **Bind key**,然后只需*按下你想绑定的键* (或在屏幕上的键盘中点击它)。选择一个轴,调整死区和曲线。 4. **启动踏板** —— 虚拟控制器将会出现。像使用任何方向盘或手柄一样,在你的模拟器中绑定它。 应用内的 **Guide** 选项卡提供了图表、针对各款模拟器的配置指南和故障排除说明。 ## 唯一真正的陷阱:扳机合并 在现代的 **XInput** 游戏中,Xbox 的**扳机**(RT/LT)是保持独立的 —— 但在较老的 **DirectInput** 游戏中,它们会**合并到一个共享的 Z 轴上**。如果在旧版模拟器中将两个踏板分别绑定到 RT 和 LT,它们就会互相干扰。 | 游戏 | API | 配置指南 | |------|-----|--------| | **BeamNG.drive** | XInput | 油门 → **RT**,刹车 → **LT**。完美运行。 ✅ | | **Live for Speed** | DirectInput | 使用**摇杆**轴 —— 油门 → LSY,刹车 → RSY,离合 → RSX。 | | **MX Bikes** | DirectInput | 部分支持。它需要 **5** 个独立轴;而 Xbox 手柄无法提供五个。目前 3-4 个可以正常工作;完整支持需要计划中的 vJoy 输出模式。 | 如果两个踏板互相抵消了作用,那就是这个原因。把其中一个移到摇杆轴上即可。 ## 工作原理 - 打开键盘的**厂商 HID 接口**(即枚举出的 `usage_page == 0xff1b` 条目)。 - 发送 **ARM** 指令;当按键深度发生变化时,主板会流式传输事件驱动的数据帧。 - 每一帧都带有 **row**(行)、**col**(列)和 **depth 0–40** → 0.0–4.0 mm。 - 将行程深度针对该校准过的按键峰值进行归一化,然后应用死区 / 曲线 / - 反转,最后将其写入虚拟手柄的轴。 - 一个守护线程专门管理硬件和手柄。UI 仅轮询显示 - 状态,因此输入延迟完全不受界面影响。 - 在停止、断开连接和退出时总是会发送 **DISARM** 指令。 - 瞬时的 USB 断开(这块主板偶尔会出现此情况)会进行原位修复,而 - 不是直接断开你的连接。 UI 是原生 pywebview 窗口(WebView2)中的一个 HTML 页面。JS 通过 `window.pywebview.api.*` 与 Python 通信。这不使用 WebHID —— 因为 Chromium 屏蔽了对键盘的 HID 读取权限,这正是硬件层采用 Python 实现的原因。 ## 添加你自己的键盘 这是本项目中比较有趣的部分,也是我们采用 MIT 协议的原因。 每一把磁轴键盘都有自己专属的激活指令和数据帧布局,但其*基本形式*几乎总是相同的:发送指令激活数据流,接收 `(row, col, depth)`。 整个设备的定义在 [`app.py`](app.py) 中对应为一个 `DeviceProfile` —— 包含 VID、PID、usage page、arm bytes、disarm bytes 和 max depth。 要添加一款键盘: 1. 找到其厂商接口,并在其自带软件运行“行程测试”或类似功能时抓取通信流量(如果厂商工具是 Web 应用,使用 WebHID 控制台嗅探器效果很好)。 2. 识别出 ARM 写入指令以及包含 row/col/depth 的数据帧。 3. 添加一个 `DeviceProfile` 并将其附加到 `SUPPORTED_PROFILES` 中。 即使你无法独立完成后续开发,也请带上你的抓包数据提交一个 Issue —— 一份原始日志往往就足以让其他人帮你完成闭环。 ## 项目结构 | 文件 | 作用 | |------|-----------| | `app.py` | 后端:HID 读取线程,ViGEm 手柄,校准,JS↔Python API | | `ui.html` | 整个界面(内联 CSS + JS) | | `keysuppress.py` | 可选的低级钩子,用于阻止作为踏板的按键输入其原本的字母 | | `KeyAxis.spec` | PyInstaller 构建定义 | | `installer/KeyAxis.iss` | Inno Setup 安装脚本 | | `fix_gamebar.bat` | 终止 `ms-gamebar` 弹窗(可逆;使用 `undo_gamebar.bat` 恢复) | | `tools/assets.py` | 构建时的素材助手 —— 不随程序发布,运行也不需要 | 从源码运行时,用户数据(`calibration.json`、`settings.json`)保存在 `app.py` 所在的目录下,安装后则保存在 `%LOCALAPPDATA%\KeyAxis` 中。 ## 常见问题 **当按键作为踏板时,它还会输入原本的字母吗?** 是的,默认情况下会 —— 而且通常这正是你想要的,因为游戏经常将同一个按键用于其他功能(例如 BeamNG 中 W 键的作用不仅仅是油门)。如果你确实需要屏蔽字母输入,请在“设置”中开启 **suppress pedal keys**。这是一个全局钩子,因此最适合用在比赛过程中你不需要打字的按键上。 **总是会弹出一个 Microsoft Store 的窗口。** 每当虚拟控制器出现时,Windows 就会询问用于打开 `ms-gamebar` 的应用程序。运行一次 `fix_gamebar.bat` 即可解决。该操作完全可逆。 **提示“ViGEm not available”。** 请安装 [ViGEmBus](https://github.com/nefarius/ViGEmBus/releases) 并重启计算机。 **控制器在我的游戏中没有出现。** 首先检查 `joy.cpl`。如果轴在那里能移动,那仅仅是游戏内绑定的问题。如果在那里也看不到,说明 ViGEmBus 未安装或踏板尚未启动。 **这会损坏我的键盘吗?** 不会。KeyAxis 仅读取行程数据流,并发送文档中记录的 arm/disarm 指令。它绝不会写入固件或更改已保存的设置。 ## 路线图 - **vJoy 输出模式** —— 8 个真正独立的轴,这将彻底支持 MX Bikes。 - 通过可插拔的设备层支持更多键盘。 - 可拖拽的响应曲线编辑器。 - 多个同时运行的虚拟控制器。 ## 许可证 MIT —— 见 [`LICENSE`](LICENSE)。随意使用、复刻或发布。
本节目与 Redragon、E-YOOSO、illumipc、BeamNG、Live for Speed 或 MX Bikes 毫无关联。
所有商标均归其各自所有者所有。
标签:云资产清单, 后端开发, 游戏外设, 漏洞挖掘, 硬件适配, 虚拟手柄, 输入设备模拟, 逆向工具, 逆向工程, 霍尔效应键盘