DVORAK化の設定変更

今まではキーボードドライバの時点でDVORAK化していたのを言語設定(IMEの設定)でDVORAKにするように変更した。
とはいっても呼び出すDLLは同じだけど。


どちらの方法でもユーザーごとの切り替えが出来ないのが痛い。
MacとかLinuxは比較的楽なのに…
Scancodeというレジストリエントリを作ることによってユーザごとに変えられるらしい。
次の研究室で問題にならないようにさっさと解決策を見つけなければ・・・


一応、かなり力技とはいえユーザごとに切り替える手法が出来たので以下メモ。

仕組み

Windowsでのキーボード入力システムは以下のようになっていると考えられる


キーボード(英語QWERTY基準のスキャンコード)
→キーボードドライバ(DLL、スキャンコードと英語QWERTYの対応)
IMEのキーボードレイアウト設定(キーボードドライバと同様のファイル、英語QWERTY→ローカル配列)
→Scancode Map(レジストリエントリ、あるスキャンコードを別のスキャンコードに変換)


順番は違うかもしれない。
どこかでDVORAKに変換してやればよい、今まではキーボードドライバの時点で変換していた。

対策1(失敗)

どこかでIMEの設定の日本語をいじってDVORAKのキーボードドライバに書き換えるという手法を見つけ、それならばIMEのキーボードレイアウト設定を新規に作ってそれを呼び出すようにすれば解決だと考えた。
IMEのキーボードレイアウト設定は"HKEY_LOCAL_MACHINE/SYSTEM/Control/Keyboard Layouts"以下に格納されている。
日本語の設定(E0010411)を元にレジストリにエントリを追加するものの、言語プロパティから呼び出すことは出来なかった。
ATOKなどのMS非純正IMEも同じ場所にエントリを作って言語プロパティから呼び出すことが出来ているので考え方は間違って無いと思われるが、本体のエントリのほかに追加したことを示すエントリなどがいるのかもしれない。

対策2

IMEの設定で変更できれば任意の時(人に触らせるときなど)にQWERTYに戻せて便利だったが、うまく行かなかったので別の手法を用いた。
Scancode Mapという設定エントリを書くことによって任意のキーを別のキーに入れ替えることが出来る。このエントリはマシン全体に作用するもの(HKEY_LOCAL_MACHINE以下)とローカルユーザのみに作用するもの(HKEY_CURRENT_USER以下)がある。
ローカルユーザーのみに作用するほうを書き換えることでユーザーごとに配列を切り替えることが可能となる。


Scancode Mapはバイナリ直で書き損じると最悪入力が出来なくなる危険なエントリなのでツールを用いた。
Win2003のリソースキットに含まれるremapkey.exeがいろいろ試した中では一番使いやすいと感じた。
以下手順

  1. Win2003リソースキットを入所
  2. remapkey.exeでDVORAK配列を製作
  3. 健康診断(失われるキーが存在するかどうかの検証)でOKならば保存する
  4. 標準だと"HKEY_LOCAL_MACHINE/SYSTEM/Control/Keyboard Layout"内にScancode Mapエントリが製作されて全員に効力が及んでしまうので"HKEY_CURRENT_USER/Keyboard Layout"にScapcode Mapエントリを製作し、中身をコピーする
  5. 元のScancode Mapエントリは削除
  6. 再起動(もしかしたら再ログインだけでOKかも)


これでログイン画面と別ユーザQWERTY、自分だけDVORAK環境が実現できた。
キー入れ替えツールは私が探した中では全てグローバル設定を書き換えるものしか見つからなかったのでグローバル→ローカルのコピーは自分で行った。
またこのエントリを書き出した設定ファイルを読み込ませることで別の場所でも同じ環境に出来ると考えられる。


レジストリが死ぬと最悪再インストールなので真似するときは自己責任で。