ツールとしては、以下のものが簡単です。
Ctrl2cap古いツールですが、Windows7やWindows 10でも動作します。単純にCapsキーをCtrlキーにしたいだけであれば、こちらを使うことをお薦めします。
https://technet.microsoft.com/ja-jp/sysinternals/bb897578.aspx
ツールを使わない方法としてはレジストリでの設定があります。これを使えば、かなり自由にキー割り当てを変更できます。たとえば、左Ctrlを右Ctrlにするなどです。この方法は、以下のサイトで解説されています。
[無変換]キーに[Windows]キーを割り当てる手順を引用すると以下のようです。
http://news.mynavi.jp/column/winxp/181/
- レジストリエディタで、HKEY_LOCAL_MACHINE \ SYSTEM\CurrentControlSet \ Control \ Keyboard Layoutを開く
- <編集>メニュー→<新規>→<バイナリ値>と選択し、「Scancode Map」を作成する
- ここにキーの変更テーブルを作り、これを有効にするために再起動する
- 不要になったり間違ったりしたら、Scancode Mapのエントリを削除する
まずたぶんまちがいだと思われるのは以下の記述です。
リスト1 ステップ4で入力するバイナリデータ値ここで「0x01000000」は「0x03000000」だと思われます。というのは、レジストリのDWORDは4バイトであること(参照:レジストリの値のデータ型を判別するには?http://www.atmarkit.co.jp/fdotnet/dotnettips/120regtype/regtype.html)、そして、文中の記述「次の 「0x01000000」は、後に続くDWORDの個数(末尾のターミネータも含む)。」が正しいとすれば、DWORDは3つあることから、このように判断しました。
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ですので、上記のような数値になります。
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 TypesWindowsはLittele Endian formatを使う8086ベースのOSとして発展したので、このような表記になっているだと思われます。
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.
エンディアンについては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