WindowsでUS配列キーボードを快適に使うキーカスタマイズ

## ノートPCの外付としてUS配列キーボードを使う
Pythonのコーディングをするようになり、シングルクォーテーションの打ちやすさからUS配列キーボードを使うようになった。
普段ノートPCを使っているので、本体はJIS配列キーボード、外付がUSキーボードとなる。
Windowsの設定を101キーボードにしつつ、ノートPC本体のJIS配列でも十分使えるよう（無変換・変換キーを活かす）キーカスタマイズを考えた。

## 実現したいこと
1. macと同様にスペースキーの左隣(JISキーボードでは無変換キー)をIME OFFに、スペースキーの右隣(JISキーボードでは変換キー)をIME ONにしたい
2. CtrlキーはAキーの左にしたい

## キーの割り当て
- スペースの両側にあるAltキーを無変換キー・変換キー相当にする
- 潰されたAltキーはその左隣のWinキーに割り当て
- 今度はWinキーが潰されるので、右側の余っているキーに割り当て（右CtrlキーorAppキー）



## 方策
- CtrlキーとCapslockキーはレジストリで入れ替え、それ以外は [alt-ime-ahk](https://www.karakaram.com/alt-ime-on-off/) や PowerToys 等のソフトウェアキーカスタマイズを併用することも考えたが、PCのスペックの問題からかキーを取りこぼすことが過去に起きたため、今回は使用しない。
- レジストリのscancodeとGoogle日本語入力のキー設定で完結させる。

## 注意点
- Linuxと違い、Windowsは101キーボードに設定すると、変換キー・無変換キーのキーコードがOSに送られてきても何もしない。scancodeで変換キー・無変換キーに相当するキーコードを割り当てても、変換キー・無変換キーとしては機能しない。
- ただし、101キーボード設定であっても、変換キー・無変換キーはレジストリのscancodeを用いて別のキーコードに割り当て直すことができる。JISキーボードの変換キー・無変換キーも活用は可能である。
- 変換キー・無変換キーの割り当て先とするキーは普段使用されることがないものが望ましい。Google日本語入力はF13・F14キーへ機能の割り当てが可能であることから、これらのキーに変換キー・無変換キーの機能を割り当てることにする（新しいバージョンのMicrosoft IMEや、ATOKでは割り当て不可）。

## 設定
1. レジストリ
    場所は`[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]`
    そこに `Scancode Map` の名前でバイナリ値を作成。
    以下の内容を16進数で続けて入力していく。

    ```: Scancode Map (外付キーボードに合わせ最大限キーを変更した場合)
    00,00,00,00,00,00,00,00, # ヘッダ
    11,00,00,00, # フッダ含めたエントリー数(11)
    38,00,5b,e0, # AltLeft(3800)←WinLeft(5be0)
    5b,e0,1d,e0, # WinLeft(5be0)←CtrlRight(1de0)
    5b,e0,5d,e0, # WinLeft(5be0)←Apps(5de0)
    64,00,38,e0, # F13(6400)←AltRight(38e0)
    65,00,38,00, # F14(6500)←AltLeft(3800)
    1d,00,3a,00, # CtrlLeft(1d00)←Capslock(3a00)
    3a,00,1d,00, # Capslock(3a00)←CtrlLeft(1d00)
    64,00,79,00, # F13(6400)←変換(7900)
    65,00,7b,00, # F14(6500)←無変換(7b00)
    64,00,70,00, # F13(6400)←ひらがな(7000)
    00,00,00,00  # フッダ
    ```
    このレジストリ変更によって、外付キーボード(AKS068)とノートPC(Inspiron)は、それぞれこのようなキー割り付けとなる。
    ![us_aks068.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/18689cb7-9f69-e59f-91ad-787a3328b91f.png)
    ![us_inspiron.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/623b3228-0bb9-f897-1260-39a652c7298a.png)
    scanmapで右CtrlキーとAppキーの両方をWindowsキーに割り当てているが、手持ちの外付USキーボードの中には右Crtlキーが無くAppキーはあるというものがあるため。使用するUSキーボードに必ず右Crtlキーがあるなら、Appキーの部分を削ればAppキーの機能を活かすことができる。
    
    なお、他言語のIMの中には右AltキーをAltGrとして用いるものがあるため、それらの使用には支障が出ることに留意（JIS配列のノートPCには右Altキーの無いものが結構ある）。
    　
2. Google日本語入力
    F13に IME ON/ひらがな入力/カタカナ入力/再変換 、F14に IME OFF/カタカナ変換/全角英数変換 の各機能を割り当てていく。
    ノートPC用にひらがな/カタカナキー相当の機能を別途F15キーとして割り当ててもよいが、USキーボードのキー数を考えてF13に機能を集約したので別々のキー割り当てとはしなかった。
    | Mode | Key | Command |
    |:--|:--|:--|
    | DirectInput | F13 | Activate IME |
    | Precomposition | F13 | Set input mode to Hiragana |
    | Composition | F13 | Set input mode to Hiragana |
    | Conversion | F13 | Set input mode to Hiragana |
    | DirectInput | Shift F13 | Activate IME |
    | Precomposition | Shift F13 | Set input mode to full-width katakana |
    | Composition | Shift F13 | Set input mode to full-width katakana |
    | Conversion | Shift F13 | Set input mode to full-width katakana |
    | DirectInput | Ctrl F13 | Reconvert |
    | Precomposition | Ctrl F13 | Reconvert |
    | Precomposition | F14 | Deactivate IME |
    | Composition | F14 | Deactivate IME |
    | Conversion | F14 | Deactivate IME |
    | Composition | Shift F14 | Switch kana type |
    | Conversion | Shift F14 | Switch kana type |
    | Composition | Ctrl F14 | Convert to full-width alphanumeric |
    | Conversion | Ctrl F14 | Convert to full-width alphanumeric |

    Google日本語入力の設定画面がいつの間にか英語表記になってしまったので、日本語で解説すると以下のようになる。
    
    [F13] 直接入力：IME ON、入力文字なし・変換前入力・変換中：ひらがな入力
    [Shift+F13] 直接入力：IME ON、入力文字なし・変換前入力・変換中：全角カタカナ入力
    [Ctrl+F13] 直接入力・入力文字なし：再変換
    [F14] 入力文字なし・変換前入力・変換中：IME OFF
    [Shift+F14] 変換前入力・変換中：カタカナ変換
    [Ctrl+F14] 変換前入力・変換中：全角英数変換
    
    この機能割り当ては、F13を連打すると必ずひらがな入力に、Shift+F13を連打すると必ずカタカナ入力になる利点がある。