キーボード配列をWindows上で変更する

概要

Windows にはキーボード配列を自由に変更する方法があります。 厳密に言うと、配列を変えるのではなくそれぞれのキーの意味を変える、 例えば CapsLock を押すと「Windows が 左Ctrl を押されたと認識する」ようにできます。

この機能はレジストリを変更する事で実現するのですが、 実はレジストリエディタでは変更作業がかなりやりにくいのです。 そこで .reg ファイルに変更内容を書き、後で結合する方法を私はとったのですが、 この方法でやる場合、他のウェブサイトの説明はあまり向いていないと思ったので .reg ファイルの使用を前提に書いてみました。

なお、原理などの詳しい情報は "Scancode Map" で検索すればたくさん出てくると思うのでここでは割愛し、 簡単な概要だけにとどめたいと思います。

.reg ファイルについて

レジストリエディタが使用する .reg ファイルの形式について少し説明します。 まず次に .reg ファイルの例を挙げます (なお、この .reg ファイルは私の環境以外で使える保証はまったくありませんので結合したりしないでください(苦笑))

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\cssfile]
@ = "Cascading Style Sheet"

簡単に説明します。 一行目は使用すべきレジストリエディタのバージョンを示します。 大かっこ("["と"]")で囲まれた中身は、 操作対象の「キー」を表します (ディレクトリシステムの path と似た表記方法ですね)。 "@" はそのキーの標準値(レジストリエディタ上で "(標準)" となっている値)を表し、 その値が "=" の後ろに続きます。 なお、値は行をまたがって指定する事はできません。 また、値には「型」があり、 文字列型は " で囲み、 DWORD型は dword: で始め、 バイナリ型は "hex:" で始める、 などそれぞれ独特の書き方で指定します。

以上より、この .reg ファイルは次のような意味になります。

「HKEY_CLASSES_ROOT のサブキー cssfile を開き、 その標準値を Cascading Style Sheet という文字列にする」

Scancode Map

本題に戻りましょう。 キーボードの各キーにはそれぞれ独自の「スキャンコード」という値が割り振られています。 例えばスペースキーのスキャンコードは 0x39、といった具合です。 基本的にキーボードからキーを入力すると、そのキーに対応したスキャンコードが Windows に送られ、それを元に Windows が押されたキーを判定します。 ここで、NT 系 Windows では前述の通り Windows が「あるキーが押された場合、 別のあるキーが押されたと認識する」ように設定する事ができます。 これを次のキーの Scancode Map というバイナリ値で設定できます。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\KeyBoard Layout

このバイナリ値は DWORD 値の並びでできています。 それぞれの DWORD 値の意味は次のとおりです。

1 つ目 0x0000でなくてはならない
2 つ目 0x0000でなくてはならない
3 つ目 4 つ目以降、何個の DWORD が続いているか
4 つ目 マッピング1
? つ目 マッピング?
... ...
最後 0x0000でなくてはならない

この規則に従ったバイナリ値を Scancode Map の値にすれば終了です。 なお、x86 CPU(Pentium、Athlon など)では各 DWORD を 1 バイトごとに「逆から」記述する必要があります。 例えば 4 つ目以降 2 つの DWORD が続く場合、 3 つ目の DWORD は十進数でいうところの "2" にする必要があります。 これは 4 byte の符号無し整数である DWORD で表すと "00 00 00 02" になります。 これを逆から書くので、3 つ目の DWORD は "02 00 00 00" を指定する事になります。

マッピングを表す 4 つ目以降の DWORD ですが、 上位 2 バイトに指定したスキャンコードのキーが 下位 2 バイトに指定したスキャンコードのキーに変換されます。 例えば CapsLock(0x3A) を 左Ctrl(0x1D) にする場合、 DWORD 値は 0x003A001D になり、Scancode Map に書き込む時はこれを逆から書くので 1D 00 3A 00 となります。

この指定はレジストリエディタですとかなりやりにくいと私は思います。 そこで .reg ファイルを使いたいと思います。

まず次の内容をコピーして .reg ファイルを作ります。 なお半角の;で始まる行はコメントですので、

Scancode Mapの行は長いので改行して表示されているかもしれませんが、 実際には改行してはいけません)。

Windows Registry Editor Version 5.00

; +-------------------------+-----------------+------------+----------+
; | 本来のキー       | 変換後のキー  | DWORD 値  | 逆読み  |
; +-------------------------+-----------------+------------+----------+
; | CapsLock(0x3A)     | LCtrl(0x1D)   | 0x003A001D | 1D003A00 |
; | 無変換(0x7B)      | LAlt(0x38)   | 0x007B0038 | 38007B00 |
; | 無変換(0x7B)      | LCtrl(0x1D)   | 0x007B001D | 1D007B00 |
; | 変換(0x79)       | LWinKey(0xE05B) | 0x0079E05B | 5BE07900 |
; | ひらがな/カタカナ(0x70) | App.Key(0xE05D) | 0x0070E05D | 5DE07000 |
; +-------------------------+-----------------+------------+----------+
; CapsLock を 左Ctrl にする場合の例
;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
;"Scancode Map" = hex:00,00,00,00, 00,00,00,00, 02,00,00,00, 1D,00,3A,00, 00,00,00,00

; CapsLock と 左Ctrl を交換する場合の例
;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
;"Scancode Map" = hex:00,00,00,00, 00,00,00,00, 03,00,00,00, 1D,00,3A,00, 3A,00,1D,00, 00,00,00,00

; CapsLock と 無変換 を 左Ctrl に、変換 を 左Windowsにする場合の例
;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
;"Scancode Map" = hex:00,00,00,00, 00,00,00,00, 04,00,00,00, 1D,00,3A,00, 1D,00,7B,00, 5B,E0,79,00, 00,00,00,00

A というキーを B というキーに変更する場合 (スキャンコードはそれぞれ 0x00AA、0x00BBとします)、 次のような手順で DWORD 値を作りましょう。

  1. A のスキャンコードを調べる
  2. B のスキャンコードを調べる
  3. A のスキャンコード、B のスキャンコードの順に並べる(0x00AA00BB)
  4. 並べた値を、1 byte ごとに逆に並べ替える(0xBB00AA00)

こうしてマッピングを表す DWORD 値を作り、 それを 2 文字ごと(1 byte ごと)にカンマで区切り、 Scancode Map 値の DWORD 4 つ目以降に並べていきます。 この時、4 byte ごとに空白をいれると見やすくなると思います。 最後に 3 つ目の DWORD を 4 つ目以降の DWORD の数にします。 できあがったらそのファイルを結合しましょう。 コメントとして書き込んだ例を参考にすると作業しやすいと思います。

最後に

注意事項をいくつか挙げます。 マッピングは「交換」ではないので例えば CapsLock を 左Ctrl に変更しただけでは CapsLock が入力できなくなります。 交換する場合は 左Ctrl を CapsLock にするマッピングも作らなければいけません。 また、(最後に言うのも何ですが) システムに近い部分のレジストリの変更は場合によって危険を伴います。 あくまで自己責任で変更してください(笑)。

2010-08-07追記。Windows 7 の 64 bit 版でも利用できました。