(2005年2月5日に書いた古い記事です)
概要
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 値を作りましょう。
- A のスキャンコードを調べる
- B のスキャンコードを調べる
- A のスキャンコード、B のスキャンコードの順に並べる(0x00AA00BB)
- 並べた値を、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 版でも利用できました。
2019-09-27追記。Windows 10でも利用できました。