Windows 7でキー配置変更

私はずっと英語キーボード*1Windows XPを使ってきた。キャップスロックはコントロールキーとして動作し、右AltキーだけでIMEのon/off、という設定をしていた*2。そこでVistaを飛ばしてWindows 7を使い始めるに当たってもそう設定しようと思った。
いろいろ試した結果、レジストリ設定でキーの入れ替えを行ない(私の実際の設定は後述)、右AltだけでのIME on/offはAutohotkeyで対応した。以下その詳細を述べる。
キーの入れ替えのためにWindows XPではAltIMEを使っていたので、それをWindows 7にインストールしてみたが機能しない。Vistaでは管理者として実行すればいいということだったが、Windows 7では管理者として実行してもキーの入れ替えが起こらない。
次にAutohotkeyを試してみた。とりあえずキャップスロックとコントロールキーの入れ替えを例にしたがって設定してみた。するとキャップスロックを打鍵するとコントロールキーが押されたままの状態になってしまう。キャップスロックのロックの動作が残っているのである。単純にCapsLock::Controlと指定するだけでなくそのほかの考えられることを試してみたがだめだった。
キャップスロックをコントロールキーにできないのではしかたがないので、あきらめてレジストリ設定で対処することにした。しかし、右AltキーのみによるIME on/offはレジストリ設定では対応できない。レジストリ設定で行えるのはあくまでキーの入れ替えで、英語キーボードに存在しない半角/全角キーが押されたようにすることはできない。別の言い方をすると、レジストリ設定で行なえるのはキースキャンコードの変更で、英語キーボードデバイスドライバーが半角/全角キーに対応するスキャンコードを持たない以上、レジストリ変更ではどうにもならない。
右AltキーのみによるIME on/offはAutohotkeyでは対応可能である。「RAlt::vkF3sc029/vkF4sc029」とするとよいという指摘がネット上で見られる。これは右Altを押すとが右Alt+バッククォート(`)が押されたようにしている。私はそれより「RAlt::vk19」が素直で良いのではないかと思う。vk19は半角/全角キーに相当する。Windowsではキーボードの打鍵でスキャンコードが発生し、それがさらに仮想キーコード(VKey code)に変換される。英語キーボードでAlt+バッククォートを押したときにはvk19が発生しているので、それを発生させてやればIMEがon/offする。
これで万全かというとそうではなく、インターネットエクスプローラー(IE)で右Altを押すとIME on/offがされると同時に、Altキーが押された状態にもなる。IEは通常のアプリケーションとは違う形でキーボード入力を処理しているようである。これに対処するため、レジストリ設定により右Altキーで発生するスキャンコードを特別なものとし、Autohotkeyでそのスキャンコードによりvk19が発生するようにした。具体的には右Altキーでスキャンコードe0, 59が発生するようにレジストリー設定を行ない、Autohotkeyではsc159::vk19とした。
更なる課題として、リモートデスクトップ接続の先でも右AltキーだけでIME on/offが行ないたい。キー入れ替えのレジストリ設定がされている接続元でAutohotkeyを止めて、接続先でAutohotkeyを同じ設定で動かせば目的は達成できる。リモートデスクトップ接続でキースキャンコードはそのまま伝わるからである。しかし、接続元のAutohotkeyを動かしたり止めるのは面倒である。Autohotkeyはウィンドウごとに動作を変えることができるのでリモートデスクトップ接続ではvk19を発生させずにスキャンコードがそのまま送られるようにすればよい。リモートデスクトップ接続のウィンドウのクラスをこのツールで調べたら「TscShellContainerClass」と分かったので以下のようにした。

#ifWinActive ahk_class TscShellContainerClass
sc159::sc159
#ifWinActive
sc159::vk19

リモートデスクトップ接続のことだけを考えるのであれば以下でもよいのだが、ほかにも例外を設ける余地を残すために上のようにしている。

#ifWinNotActive ahk_class TscShellContainerClass
sc159::vk19

たとえば、リモートデスクトップ接続に加えて、「foobar」というタイトルのウィンドウでもvk19の代わりにsc159が送られうようにするためには以下のようにする。

#ifWinActive ahk_class TscShellContainerClass
sc159::sc159
#ifWinActive foobar
sc159::sc159
#ifWinActive
sc159::vk19

ちなみに、私が使っているキー入れ替えのレジストリ設定は以下の通りである。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,09,00,00,00,1d,00,3a,00,38,00,1d,00,\
  29,00,38,00,01,00,29,00,3a,00,01,00,53,e0,5d,e0,5d,e0,1d,e0,59,e0,38,e0,00,00,00,00

これは以下の入れ替えを行なう。

入れ替え元 入れ替え先
Caps lock LControl
LControl LAlt
LAlt `/~
`/~ ESC
ESC Caps lock
App Delete
RControl App
RAlt sc e0, 59

おまけ

私が入手したWindows 7のPCはDell Studio 15という機種なのだが、上記のような設定をしたあともキャップスロックのキーを押すと、それはコントロールキーとして動作しているのにもかかわらず画面右下に大きくキャップスロックの状態表示が出てしまっていた。コントロールキーを多用する私には、これは非常に目障りで何とかしたかった。調べたところDell独自のQuickSetというプログラムがその表示を行なっていることがわかった。そこで、それを停止させ、起動時にも実行されないようにmsconfigで設定を変更した。
QuickSetはキー操作で画面の明るさや音量を変更したときにそのことを画面に表示することも行なっており、有用なのだが、キャップスロックの表示だけを止めることはできないのでしかたがない。そして、QuickSetが動いていなくても画面の明るさ調節や音量調節は行なえる。
Studio 15は出荷時の状態でキーボード最上段のファンクションキーをF1とかF5などのキーとして使うにはFnキーを押しながら操作するようになっていた。Fnキーを押さないと画面の明るさ調整や音量調整になってしまう。これでは私には不便極まりないので、BIOSの設定で、Fnキーなしではファンクションキーとして動作し、Fnキーを押すと画面の明るさ調整などが行なえるようにした。

2009-11-17追記

Autohotkeyの設定をsc159::vk19sc159とすることで、条件設定をすることなく、リモートデスクトップ接続で望んだ結果が得られることが分かった。結局、vk19sc159.ahk (.ahkAutohotkeyの設定ファイルの拡張子。拡張子がそうであればファイル名は何でもいい)というテキストファイルに「sc159::vk19sc159」の1行を入れ、そのファイルを起動すればよい。言うまでもなく前提はIME on/offに使うキーがスキャンコードe0, 59を発生していることである。

*1:厳密には米国仕様キーボードなのだが英語キーボードと呼ぶほうが分かりやすいと思い、そう記述している。イギリス仕様も「英語キーボード」だがそれはポンド記号があったり右のシフトが遠くて好ましくない

*2:IME on/offという頻繁に行なう動作を1つだけのキーで行なうことに慣れたら、そうでない状況は我慢ができない。