Windows 10: キーボード配列の交換・変更

(2021.1)

Windows 10は大型アップデートのたびにそれなりに挙動が変わっている。ヴァージョン 20H2 October 2020 Update でも動作する、キーボード配列を入れ替える方法について確認した。

Windows 7 までは, [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411] ディレクトリの Layout File で指定されているファイル名 <kbdjpn.dll> を書き換えればよかった。Windows 10 では正常に動かない。

キーマップ変更・入替えソフト

昔から多くのキーマップ変更ソフトがある。AutoHotkey や最近では PowerToys (Windows 10 ヴァージョン1903 May 2019 Update以降で動作) など。

現代は, UWPアプリ (≒ Microsoft Store アプリ) が鬼門。権限昇格時の対応もある。ユーザ空間のアプリケーションで完璧にこなすのは難しい。

AutoHotkey in Windows 10 - Hotkeys not working in some applications

Windows 10 の IME (テキストサービス) も, 直接入力時は手が出せないし, そもそも Windows における IME の機能はテキスト編集であって, キー押下げ・離すには関与できない。

以降の解説では、Windows 10の設定やキーボードレイアウト定義ファイルで何とかする。

言語 (ロケール) とキーボード

Windows 10では、言語パックをインストールすることで、ユーザは複数の言語を使える。

Windows 10, 設定 > 時刻と言語 > [言語]タブ (Settings > Time & Language > Language) に言語が列挙される。

ここで言語を追加したりできる。Windows 10 の "言語" は、言語と地域がセットになったもの (ロケール)。日本語は地域の区別がなく "ja", 英語は "en-GB" など。

キーボードは、設定画面としては、言語にぶら下がるようになっている。「言語のオプション」(Language options) で追加できる。

キーボードとして何を追加できるかは、ロケールによって決まっている。

日本語の場合は IME (テキストサービス; text service) しか表示されない。レジストリを弄ってキーボード配列を無理やり追加しても、言語バーから選択できず、使えない。

参考: レジストリの場所は [HKEY_CURRENT_USER\Control Panel\International\User Profile]. ユーザ単位。言語のオプションには表示されるが, そこまで。

英語などの場合は、キーボードとして、キーボード配列 (keyboard layout) の一覧から選ぶ。複数も可。それぞれキーボード配列は, (過去との互換性のため) 言語属性を持っているが、異なる言語からでも使える。

ユーザは, Windows 10 のキーボード配列 (keyboard layout) とテキストサービス (text service) について、言語バーから、または [Win] + space キーで切り替えることができる。

設定 > 時刻と言語 > [言語]タブ, 画面上部にある "キーボード" から、別の設定画面に進める。

既定の入力方式の上書き (Override for default input method) で、キーボード配列 / テキストサービスを選べるが、やはり、ただ一つしか選べない。

なので、IME がどのキーボード配列を使うかが選べない。IME とキーボード配列は同列ではないのに、このような画面構成になっているのが混乱している。

テキストサービス

Windows では, それぞれのテキストサービスは, TIP_KEYBOARD, TIP_SPEECH または TIP_HANDWRITING のいずれか一つのカテゴリを持つ。TIP_KEYBOARD カテゴリのテキストサービスが IME と呼ばれる。

Windows の内部設計上、テキストサービスはカテゴリごとに active にできるようになっている。しかし、言語バーや "キーボード" 設定画面の作りから、ユーザは同時にはただ一つしか選ぶことができない。これは酷い。

ハードウェアキーボードレイアウト

この設定は, Windows 10 ヴァージョン 1809 以降で対応.

日本向けの特別な機能として、上記のキーボードとは別に、ハードウェアキーボードレイアウトの機能がある。

管理者権限で「言語のオプション: 日本語」を開くと, [レイアウトを変更する] ボタンが表示される。すごい決め打ちで, 日本語キーボード (106/109キー), USキーボード(101/102キー) の二つから選べる.

管理者権限でしか変更できない。その他のキーボード配列が選べない。

日本語環境で、その他のキーボード配列を使う方法

既存のキーボード配列

Dvorak 配列にしてみよう。実は, 上記のハードウェアキーボードレイアウトについては、内部ではどのようなキーボード配列でも設定できる。設定画面に問題がある。

レジストリを直接編集するしかない。管理者権限が必要.

この作業の前に、上記の設定画面からハードウェアキーボードレイアウトを少なくとも1回、変更しておくこと。この操作によりレジストリにエントリが作られる. あと、別の言語を追加し, QWERTY キーボードを追加して切り替えられるようにしておくと, もしもの際に役に立つ。

変更するレジストリの場所は [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters]. LayerDriver JPN というズバリ日本専用の key がある. 106キーボードだと kbd106.dll という値になっているはず。

これを kbddv.dll に書き換えるだけ。次の内容で .reg ファイルを作り、レジストリエディタでインポートしてもよい。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters]
"PollingIterations"=dword:00002ee0
"PollingIterationsMaximum"=dword:00002ee0
"ResendIterations"=dword:00000003
"LayerDriver JPN"="kbddv.dll"
"LayerDriver KOR"="kbd101a.dll"
"OverrideKeyboardIdentifier"="PCAT_106KEY"
"OverrideKeyboardType"=dword:00000007
"OverrideKeyboardSubtype"=dword:00000002

更新したらPC を再起動.

独自の配列をつくる

Microsoft Keyboard Layout Creator を使えば、どのような配列も作れる。しかも, .dll ファイルのインストーラまで作ってくれる.

Download Microsoft Keyboard Layout Creator (MSKLC) Version 1.4 from Official Microsoft Download Center

全部説明すると長くなるが、File > [Load Existing Keyboard...] で元にする配列を読み込み、適宜修正して, Project > [Build DLL and Setup Package] で出力する。

32bit, 64bit アプリケーションのために DLL を二つインストールする必要がある。それも自動でしてくれる setup.exe が生成される.

管理者権限で実行するとインストールされる。コントロールパネルからアンインストールも可能。よく出来てる。

c:\windows\system32c:\windows\SysWOW64 の2ヶ所にインストールされる。前者が64bit、後者が32bit.

レジストリ上は, [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\a0000476] 辺りに登録されたうえで, ユーザの言語 (ロケール) 設定から参照される。

後は, 上のレジストリ LayerDriver JPN にこいつを指定してやれば OK.

制限: 図形文字キーについてだけしか変更できない。こちらも本当は, .dll は制御キーも対応しているのに, Keyboard Layout Creator のユーザインタフェイスの制限。

キーマップの入替え

制御キーの部分は、昔からの機能が Windows 10 でも生きている。[Caps Lock] と [Ctrl] の入替えもしてみよう。

やはり管理者権限が必要.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] ディレクトリに Scancode Map という key を作ればよい。Keyboard Layout が単数形なのに注意。

ググると大量に解説ページが出てくるので割愛。と思ったが、意外と間違っているページがチラホラ。あと, ほとんどの解説ページでは値の内容の説明がない。しょうがないな。

AutoHotkey は動作方法が違うので、混同していたら, そっと閉じるのがよい.

ちゃんとしているページ;

レジストリ変更の補助ソフト; Windows 10でも利用可能. KeySwap for XP

公式の解説; Keyboard and mouse class drivers - Windows drivers | Microsoft Docs

スキャンコードの一覧はこちら; Japanese Keyboard (layout and scancode)

リンク

Windows7でのキーボードレイアウトの指定 | untitled document .inf ファイルの作り方も.