AutoHotKeyから英語|日本語キーボード設定変更方法

## AutoHotKeyから英語(日本語)キーボード設定変更方法
基本的には、AutoHotKeyを使わずに作業するのが当たり前かもしれないが、どうせ使うならば一つのツールにまとめてしまおうと考えた。
考えただけで実行に移すのもどうかと思うが・・・。

ということで、表題通り、AutoHotKeyからキーボード設定を変更する方法の述べる。
AutoHotKeyさえ導入しておけば、あとは今回のプログラムを実行するだけで変更できるという優れもの。

そう思ったのだが、当然のように管理者権限が必須になるため、利用者によっては実行に失敗することだろう。

![admin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425551/10367724-c237-1392-54fe-0c87729bf41e.jpeg)







### プログラミング部分
解説するまでもないことだが、、、
AutoHotkeyを使い、事前設定のキー押下にて、レジストリが書き換わる。
当然(上記でも触れたが)管理者権限が必須になる。
その理由は、レジストリを変更するため、一般権限での実行では失敗する。

そして、本プログラムの実行後は、端末を再起動しなければ設定が反映されない。

```common-lisp:AutoHotKey.ahk
; F1とeキーの組み合わせで英語キーボード設定に代わる。
F1 & e::
	RegRead, before, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, LayerDriver JPN
	RegWrite, REG_SZ, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, LayerDriver JPN, kbd101.dll
	result := A_LastError
	RegRead, after, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, LayerDriver JPN
	msgbox, 書き込み値：kbd101.dll`n変更前：%before%,`n1つ目のレジストリ書き込み結果：%result%,`n変更後：%after%
	RegRead, before, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardIdentifier
	RegWrite, REG_SZ, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardIdentifier, PCAT_101KEY
	result := A_LastError
	RegRead, after, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardIdentifier
	msgbox, 書き込み値：PCAT_101KEY`n変更前：%before%,`n2つ目のレジストリ書き込み結果：%result%,`n変更後：%after%
	RegRead, before, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardSubtype
	RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardSubtype, 0
	result := A_LastError
	RegRead, after, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardSubtype
	msgbox, 書き込み値：0`n変更前：%before%,`n3つ目のレジストリ書き込み結果：%result%,`n変更後：%after%
	RegRead, before, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardType
	RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardType, 7
	result := A_LastError
	RegRead, after, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardType
	msgbox, 書き込み値：7`n変更前：%before%,`n4つ目のレジストリ書き込み結果：%result%,`n変更後：%after%
return

; F1とjキーの組み合わせで日本語キーボード設定に代わる。
F1 & j::
	RegRead, before, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, LayerDriver JPN
	RegWrite, REG_SZ, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, LayerDriver JPN, kbd106.dll
	result := A_LastError
	RegRead, after, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, LayerDriver JPN
	msgbox, 書き込み値：kbd106.dll`n変更前：%before%,`n1つ目のレジストリ書き込み結果：%result%,`n変更後：%after%
	RegRead, before, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardIdentifier
	RegWrite, REG_SZ, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardIdentifier, PCAT_106KEY
	result := A_LastError
	RegRead, after, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardIdentifier
	msgbox, 書き込み値：PCAT_106KEY`n変更前：%before%,`n2つ目のレジストリ書き込み結果：%result%,`n変更後：%after%
	RegRead, before, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardSubtype
	RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardSubtype, 2
	result := A_LastError
	RegRead, after, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardSubtype
	msgbox, 書き込み値：2`n変更前：%before%,`n3つ目のレジストリ書き込み結果：%result%,`n変更後：%after%
	RegRead, before, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardType
	RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardType, 7
	result := A_LastError
	RegRead, after, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Services\i8042prt\Parameters, OverrideKeyboardType
	msgbox, 書き込み値：7`n変更前：%before%,`n4つ目のレジストリ書き込み結果：%result%,`n変更後：%after%
return
```

上記実行後に、それぞれ5つのダイアログメッセージボックスが表示される。
それには、変更前後のレジストリと変更値を記載しており、変更結果も表示するようにしている。

* メッセージボックス内容
  * 書き込み値：ここに表示される値が変更後の値と同じになっていること。
  * 変更前：レジストリを変更する前の値が表示される(戻すのであればどこかにメモを取っていた方が良い？)。
  * レジストリ書き込み結果：0が成功で、0以外が失敗になる。
  * 変更後：レジストリを変更したあとの値が表示される。

Windows10にて、動作確認をした。
他のバージョンでも動くことだろう(逆に言えば、Windows10では普通にマウス操作だけで完了するほど簡単に切り替えられるようになっている)。


いっそのこと。キャップスロック(caps lock)キーもコントロールキーに変更する処理を追加しようと思ったが、量が多いため、断念した。
どうせ、そんなキーボードを使うことはない・・・はず。
職場に自前のキーボード持ち込みが許されない場合は、常に大文字で打ち込むことになるけどね。


以上。