「自作キーボードを macOS と Windows の両方で使えるようにしたい」というのはよくある悩みだと思うが、これに対してあまりインターネット上では見かけない方法で対処したのでまとめておく。
ちなみに、記事中で GUI
とか LANG1
とか自作キーボードでよく見かける用語を使っているので「自作キーボードの話」ということにしているが、割と一般的に使えるテクだと思われる。
前提
この記事は 「主に macOS を使っているが、たまに Windows も使いたい人」 を対象としているので、基本的には「macOS 側はいじらずに Windows 側で特殊設定をしてなんとかする」というアプローチをとっている。
また、この記事中で使用している OS は Windows 11 Pro (24H2)。
課題
macOS で使っている自作キーボードを Windows で使用しようとしても、普通はそのままだと同じようには使えない。
例えば 言語切り替え (IME オンオフ) は Windows では「全角半角」キーを使用するのが一般的だが、macOS では「英数 (LANG2
)」「かな (LANG1
)」キーが使用されるという違いがある。少し前までは macOS と同じスタイルで Windows の言語切り替えをするための設定に手間どったものだが、最近の Windows では言語切り替えの方式が macOS と同じになってきており、自作キーボードにおいてこの点は特に気にする必要はなくなった。具体的には、OS レベルで LANG1
/ LANG2
キーによる IME オンオフが普通にできるようになった。1 助かる!!
とするとあと困るのは 修飾キーの違い である。この問題については以下の記事が詳しい。
Windows と macOS では GUI キーが Win
と command
に, CTL キーが Ctrl
と control
に対応しているが、ショートカットキーの多くは Ctrl
と command
で共通している。だから macOS ユーザが Windows にて Win
キーを押すとき、たいていの場合は Ctrl
として認識されて欲しい。
自分は熱心な Windows ユーザではないので Win
キー関連のショートカットキーを全く使用しておらず、Win
キーをすべて潰してでも Ctrl
として動作して欲しい。
試したけど採用しなかった方法
PowerToys でキー置き換え
実は PowerToys の Keyboard Manager で Win
を Ctrl
に置き換えるだけでほとんどのケースは問題なく動く。ただし Win
+ L
で「画面をロックする」ショートカットキーだけはどうやっても発動してしまう。 Ctrl
+ L
は Web ブラウザの「アドレスバーにフォーカスする」ショートカットでよく使うため、これが使えないのはつらい。
なぜ Win
+ L
のときだけ Ctrl
+ L
に置き換えてくれないのかというと、この「画面をロックする」機能が OS のユーザレベルよりもさらに低いレベルで処理されているためだと思われる。画面ロック機能そのものを無効化する手もあるが、それはセキュリティ的にかなりヤバいので却下した。
キーボードのファームウェアで OS 検出
QMK には OS を検出する機能がある2ので、QMK に対応しているキーボードであれば「Windows のときは Ctrl
/ macOS のときは command
」というキー割り当てが可能になる。ただファームウェアいじりはハードルが高くて後回しにしていたところ、結果的に後述の方法で解決できてしまったので試すことなく終わった。
レイヤを複数用意して切り替える
Windows 用のレイヤと macOS 用のレイヤを用意しておいて、OS を切り替えるときにレイヤを切り替えることで対応する方法。運用でカバー!! これこそ最終手段なのでやりたくなかった。
採用した方法
レジストリをいじって 「キーボードドライバのレベルで Win キーを Ctrl キーに置き換える」 ことで期待通りの振る舞いを実現できた。
字面からわかる通り、この方法はもちろんリスクがあり...
- レジストリ書き換えをするので最悪 Windows が壊れる
- すべてのキーボードの振る舞いが変わる
- Windows 上のすべてのユーザに影響する
真似する場合は自己責任で、十分に注意されたい。
手順
レジストリエディタを開き、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
直下に「バイナリ値(B)」を新規作成する。
名前を Scancode Map
とし、値は以下を指定する。
00000000 00000000 02000000 1de05ce0 00000000
最後に、設定を反映させるために Windows を再起動する。
解説
このレジストリを編集する方法では、キーボードドライバの振る舞いを変更している。3 ドライバのレベルでキーマップを変更しているので、PowerToys では不可能だった Win
+ L
も問題なく Ctrl
+ L
に置き換えることができる。
バイト列 | 意味 |
---|---|
00 00 00 00 |
ヘッダ (すべて 0) |
00 00 00 00 |
ヘッダ (すべて 0) |
02 00 00 00 |
マッピング件数 (終端を含む) → 2件 |
1D E0 5C E0 |
右 Win (E0 5C ) を 右 Ctrl (E0 1D ) に置き換え4
|
00 00 00 00 |
終端 (すべて 0) |
今回は「右 Win
キーを右 Ctrl
に置き換える」ことをやっているので、左 Win
キーはそのまま Win
キーとして動作する。自作キーボードの Win
キーは必ず右 Win
キーを割り当てることで Windows では Ctrl
として動作するようになり、他のキーボードでは多くの場合は左 Win
キーのみ使用されるため通常通り Win
キーとして動作するという仕組みだ。
もし左右の Win
キーを両方とも Ctrl
に置き換えたい場合は、左側のマッピング設定を追加してマッピング件数を +1 すればよい。
00000000 00000000 03000000 1d005be0 1de05ce0 00000000
余談
この方法は ChatGPT と壁打ちしていて知ったのだけど、最初 Scancode Map のマッピング数を誤って出力してきて、公式ドキュメントを見て裏取りしたところ誤りに気づくことができた。「レジストリいじる」といった下手すると OS を破壊する行為をするときは特に、AI の言うことは信用しすぎないほうがよい...。