KeyKey 兩鍵翻頁器的命令列配置工具,取代原廠只有 x86_64 版的配置軟體(Rust)
  • Rust 87.2%
  • Python 11.1%
  • Shell 1.7%
Find a file
Ming Tsay 9bee5a24e7
GUI i18n:四種語言、語言選單、依語系切換字型
- 右上角語言選單(自動/English/日本語/繁體中文/简体中文),選擇會記住
- 字型依語系調整後備順序:繁中蘋方 TC、簡中蘋方 SC、日文冬青黑體
- 字型檔改 mmap(蘋方 .ttc 78 MB),不整檔讀進記憶體
- 冬青黑體 ascent 較小,y_offset_factor 0.2 對齊基線(對照蘋方實測)
- 下拉選單填滿欄寬並截斷、按鈕列可換行,日文長字串不再溢出
- 說明文字靠左,避免 columns 的 justify 撐開英文字距

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019zAhkv92zMSevT618Ngvzu
2026-10-15 17:55:16 +08:00
assets 加入 App 圖示原圖(1024×1024,ChatGPT 生成) 2026-10-15 17:43:11 +08:00
fixtures KeyKey 配置工具:Rust 重寫原廠 x86_64 配置軟體 2026-10-15 16:19:27 +08:00
locales GUI i18n:四種語言、語言選單、依語系切換字型 2026-10-15 17:55:16 +08:00
scripts 新增 macOS 發版腳本:universal 建置、Developer ID 簽章、公證、打包 2026-10-15 17:06:34 +08:00
src GUI i18n:四種語言、語言選單、依語系切換字型 2026-10-15 17:55:16 +08:00
tests i18n:library 與 CLI 支援 en / ja / zh-TW / zh-CN 2026-10-15 17:48:44 +08:00
tools/trace KeyKey 配置工具:Rust 重寫原廠 x86_64 配置軟體 2026-10-15 16:19:27 +08:00
.gitignore 新增 macOS 發版腳本:universal 建置、Developer ID 簽章、公證、打包 2026-10-15 17:06:34 +08:00
Cargo.lock GUI i18n:四種語言、語言選單、依語系切換字型 2026-10-15 17:55:16 +08:00
Cargo.toml GUI i18n:四種語言、語言選單、依語系切換字型 2026-10-15 17:55:16 +08:00
CHANGELOG.md README:release 執行檔已簽章公證,不再需要 xattr 2026-10-15 17:11:06 +08:00
LICENSE-APACHE 準備公開:README、CHANGELOG、MIT OR Apache-2.0 授權 2026-10-15 16:47:42 +08:00
LICENSE-MIT 準備公開:README、CHANGELOG、MIT OR Apache-2.0 授權 2026-10-15 16:47:42 +08:00
PROTOCOL.md 修正出廠燈光描述:幸運色 2 是每按一次換隨機色,不是青色 2026-10-15 16:36:33 +08:00
README.md README:release 執行檔已簽章公證,不再需要 xattr 2026-10-15 17:11:06 +08:00

keykey

KeyKey 兩鍵藍牙翻頁器(USB 5262:4B4B)的命令列配置工具,取代原廠只有 x86_64 版的配置軟體。

A command-line configurator for the KeyKey two-key Bluetooth page turner, replacing the vendor's abandoned x86_64-only app. Byte-for-byte compatible with the vendor tool.

為什麼

KeyKey 是一款常用於電子書、簡報翻頁的兩鍵藍牙小鍵盤(WCH CH57x),按鍵、巨集與燈光都要用原廠配置軟體設定。 原廠軟體作者佚名、已停止更新,macOS 版只有 x86_64,在 Apple Silicon 上得靠 Rosetta 2 執行, 而 macOS 28 會移除 Rosetta,屆時原廠軟體將無法開啟。

這個專案依原廠軟體反組譯整理出通訊協定,用 Rust 重新實作全部功能,並以原廠程式實際送出的 bytes 逐一比對驗證。

功能

  • 單鍵:鍵盤鍵(含任意修飾鍵組合)、多媒體鍵、滑鼠按鍵/位移/滾輪
  • 巨集:鍵盤巨集最多 14 步、滑鼠巨集最多 9 步,可設按下時間、延遲、重複次數、無限循環、按住循環
  • 原廠 10 組翻頁預設(Android 音量鍵、iOS 方向鍵、Kobo、Page Up/Down、滑鼠點螢幕兩側……)
  • 燈光:8 種模式,每顆燈分開設定,顏色用 #rrggbb 或 HSL
  • 恢復出廠設定、關燈、重新開機
  • 韌體更新(CH57x IAP bootloader,純 Rust USB,不需要 libusb)
  • Power-on 開機模組配對(另售配件)
  • USB/藍牙模式切換(原廠程式有定義、但介面沒有提供)

安裝

到 Releases 下載 macOS universal 執行檔(Apple Silicon 與 Intel 皆可)。 執行檔以 Developer ID 簽章並經 Apple 公證,首次執行時 Gatekeeper 會連網查核:

tar xzf keykey-v0.1.0-macos-universal.tar.gz
mv keykey-v0.1.0-macos-universal/keykey ~/.local/bin/   # 或任何 PATH 內的目錄

或從原始碼安裝(Rust 1.89 以上):

cargo install --git https://git.mingtsay.tw/mt/keykey.git

Linux/Windows 理論上可以編譯(hidapi 與 nusb 都跨平台),但尚未測試。

使用

先用 USB 線接上 KeyKey。鍵號、燈號是 1、2,與原廠介面相同。

keykey info                                   # 韌體版本、電量、藍牙 MAC
keykey keys                                   # 列出所有按鍵名稱

# 單鍵
keykey set 1 ctrl+c                           # 修飾鍵用 + 組合
keykey set 1 cmd+shift+4
keykey set 2 volume_up                        # 多媒體鍵
keykey set 1 mouse:left                       # 滑鼠左鍵
keykey set 2 mouse:wheel=-3                   # 滾輪(上為正)
keykey set 1 mouse:x=-10,y=5                  # 游標位移(左、上為負)

# 巨集:每步 動作/按下ms/延遲ms,時間為 10 的倍數、0~2500,省略為 0
keykey macro 1 ctrl+c/20/50 ctrl+v --times 2
keykey macro 2 mouse:x=127/0/0 mouse:left/0/1000 --while-held
keykey macro 1 down/10/100 --forever

# 預設與燈光
keykey preset                                 # 列出 10 組原廠預設
keykey preset 2                               # 左右方向鍵
keykey light                                  # 列出燈光模式
keykey light all press-color --color '#39c5bb'
keykey light 2 night-breathing --color 175,141,64
keykey lights-off
keykey factory-reset                          # 音量加減 + 按下亮隨機色

# 維護
keykey firmware KeyKey_V102.bin               # 韌體更新,約 4 秒
keykey restart                                # 重新開機
keykey exit-bootloader                        # 卡在 bootloader 時救回
keykey mode ble                               # 切換藍牙/USB 模式

任何指令加上 --dry-run,只會印出要送出的封包,不連接裝置。

注意事項

  • 裝置只能寫入,無法讀回目前設定。 修改前請自己記下原本的設定。
  • 原廠配置軟體開著時會獨佔連線,兩者不能同時使用。
  • 燈光的 HSL 中,L 是亮度;即使是彩虹等不需指定顏色的模式,L=0 也會不亮。沒給 --color 時預設用出廠值。
  • 「幸運色」模式每按一次會換一個隨機顏色。
  • 原廠的「復位重啟」只會讓裝置進入 bootloader 並停在那裡;本工具的 restart 會再送出離開指令,真正重開機。

實作與驗證

檔案 內容
PROTOCOL.md 由原廠程式反組譯整理的 HID/IAP 協定文件
fixtures/vendor.json 原廠程式在假 HID/USB 裝置上執行時,實際送出的每一個 byte
tests/vendor.rs 逐 byte 比對本工具與原廠的輸出
tools/trace/trace.py 產生 fixtures 的記錄器
scripts/release-macos.sh 建置 universal 執行檔、簽章、公證、打包

cargo test 涵蓋 131 組按鍵碼、54 個操作情境(預設、單鍵、巨集、燈光、Power-on、韌體更新分包), 以及 4913 組 RGB→HSL 換算與 Qt 的結果比對。單鍵、巨集、燈光、韌體更新與重新開機也都在實機上驗證過。

重新產生 fixtures 需要 Python 3.11、PySide6,以及從原廠 PyInstaller 執行檔抽出的 .pyc (原廠程式不包含在本 repo):

python3.11 tools/trace/trace.py <原廠 pyc 目錄> fixtures/vendor.json

刻意與原廠不同之處

  • 所有 HID 封包補 0 到 65 bytes(原廠有些只送 8~17 bytes,macOS 的 hidapi 不會自動補齊)。
  • Power-on「配對後解除」的封包不帶殘留的 MAC(原廠改動全域變數造成的 bug)。
  • restart 會真正重新開機(見上方注意事項)。
  • 原廠按鍵選擇視窗中的 Robit 按鈕沒有對應代碼(原廠點了也不會有作用),不列入按鍵表。

授權

以 MIT 或 Apache-2.0 授權,任選其一。

本專案與 KeyKey 原廠無關。KeyKey 為其權利人之名稱。