Windows/MacOSで英語キーボードを使っている場合、私は、CapsキーをCtrlキーに割り当てています。MacOSであればOSの機能、[システム環境設定]-[キーボード]-[キーボード]タブ-[修飾キー]で変更できます。しかしWindowsでは何かのツールか、レジストリでの設定が必要になります。
ツールとしては、以下のものが簡単です。
Ctrl2cap
https://technet.microsoft.com/ja-jp/sysinternals/bb897578.aspx
古いツールですが、Windows7やWindows 10でも動作します。単純にCapsキーをCtrlキーにしたいだけであれば、こちらを使うことをお薦めします。
ツールを使わない方法としてはレジストリでの設定があります。これを使えば、かなり自由にキー割り当てを変更できます。たとえば、左Ctrlを右Ctrlにするなどです。この方法は、以下のサイトで解説されています。
[無変換]キーに[Windows]キーを割り当てる
http://news.mynavi.jp/column/winxp/181/
手順を引用すると以下のようです。
-
レジストリエディタで、HKEY_LOCAL_MACHINE \ SYSTEM\CurrentControlSet \ Control \ Keyboard Layoutを開く
-
<編集>メニュー→<新規>→<バイナリ値>と選択し、「Scancode Map」を作成する
- ここにキーの変更テーブルを作り、これを有効にするために再起動する
- 不要になったり間違ったりしたら、Scancode Mapのエントリを削除する
簡潔に解説されていてわかりやすいのですが、レジストリに設定する値についての知識を前提としていて、この解説だけを読むとよくわからないことがある、そして、少しだけ間違いがあることがやや残念です。
まずたぶんまちがいだと思われるのは以下の記述です。
リスト1 ステップ4で入力するバイナリデータ値
00 00 00 00 00 00 00 00
02 00 00 00 5B E0 7B 00
00 00 00 00 00 00 00 00
これで設定完了です。表2の情報はDWORDで管理されており、最初の「0x00000000」「0x00000000」はヘッダ。次の 「0x01000000」は、後に続くDWORDの個数(末尾のターミネータも含む)。そして次の「0x5BE07B00」が肝心の変換コード。 [無変換]キーは0x7B、[Windows]キーは0xE05Bですので、上記のような数値になります。
ここで「0x01000000」は「0x03000000」だと思われます。というのは、レジストリのDWORDは4バイトであること(参照:レジストリの値のデータ型を判別するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/120regtype/regtype.html)、そして、文中の記述「次の 「0x01000000」は、後に続くDWORDの個数(末尾のターミネータも含む)。」が正しいとすれば、DWORDは3つあることから、このように判断しました。
scancode mapの書式を検索してみると以下のWWWページが見つかりました。
Keyboard and mouse class drivers
https://msdn.microsoft.com/en-us/library/windows/hardware/jj128267%28v=vs.85%29.aspx
途中に以下のような記述があり、上記の日本語の解説とも一致します。
The first and second DWORDS store header information and should be set
to all zeroes for the current version of the Scan Code Mapper. The third
DWORD entry holds a count of the total number of mappings that follow,
including the null terminating mapping. The minimum count would
therefore be 1 (no mappings specified). The individual mappings follow
the header. Each mapping is one DWORD in length and is divided into two
WORD length fields. Each WORD field stores the scan code for a key to be
mapped.
そして、「リスト1 ステップ4で入力するバイナリデータ値」は
00 00 00 00 00 00 00 00
03 00 00 00 5B E0 7B 00
00 00 00 00 00 00 00 00
だと思われます。
もしくはキー設定の変更が1つ分であれば、「リスト1 ステップ4で入力するバイナリデータ値」は最後の「0x00」が8個ではなく4個、つまり
00 00 00 00 00 00 00 00
02 00 00 00 5B E0 7B 00
00 00 00 00
になると思われます。
次にレジストリに設定する値についての知識を前提としている点です。記事では、[無変換]キーに[Windows]キーを割り当てていて、設定する値は以下のように書かれています。
そして次の「0x5BE07B00」が肝心の変換コード。 [無変換]キーは0x7B、[Windows]キーは0xE05Bですので、上記のような数値になります。
0x7B[無変換キー]を0xE05B[Windowsキー]にするわけですから、すなおに表記すれば、
00 7B E0 5B
となりそうなものですが、実際に記述する値は、
5B E0 7B 00
で、先頭を最後尾にした、逆順に並べた表記です。これはこれでわかりやすいのですが、なんだかふしぎです。さきほどの
Keyboard and mouse class driversでの記述を見てみると、確かにこのようになっています。
0xE01D0000 | Remove the right CTRL key (0xE01D --> 0x00). |
0xE038E020 | Right ALT key --> Mute key (0xE038 --> 0xE020). |
もう少し説明を読んでみると以下のような記述があります。
In the Keyboard Layout key, the Scancode Map
value must be added. This value is of type REG_BINARY (little Endian
format) and has the data format specified in the following table.
Littele Endian formatでの記述なのですね。もう少し調べてみると次のような説明を見つけました。
Registry Value Types
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms724884%28v=vs.85%29.aspx
In little-endian format, a multi-byte value is stored in memory
from the lowest byte (the "little end") to the highest byte. For
example, the value 0x12345678 is stored as (0x78 0x56 0x34 0x12) in
little-endian format.
WindowsはLittele Endian formatを使う8086ベースのOSとして発展したので、このような表記になっているだと思われます。
エンディアンについてはWikipediaの説明がわかりやすいでしょう。
エンディアン
https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3#.E3.83.AA.E3.83.88.E3.83.AB.E3.82.A8.E3.83.B3.E3.83.87.E3.82.A3.E3.82.A2.E3.83.B3