AutoHotkeyにおけるラベルの優先度と3キー同時押しの定義
AutoHotkey(Version v1.0.48.05.L61)のホットキーの定義方法だと、どのラベルの内容が実行されるのか迷うときがあります。その優先度についてのまとめです。
後に書いた方が優先される(コンビネーションキー)
次のコンビネーションキー二つから成るコードを実行します。
a & z::msgbox, "a&z"
b & z::msgbox, "b&z"
このときに、「a,b,z」を同時押し(正確にはaとbを押した状態でz)すると、「b&z」と表示され、二つの行を入れ替えて、
b & z::msgbox, "b&z"
a & z::msgbox, "a&z"
としたときは「a&z」が表示されます。 このことから、後ろに書いた方が優先的に実行されると考えられます。
コンビネーションキーが優先される(通常ホットキーラベルとコンビネーションキー)
続いて、「Ctrl+z」と「a+z」のホットキーを定義してみます。
^z::msgbox, "^z"
a & z::msgbox, "a & z"
このときに、「Ctrl,a,z」を同時押し(Ctrlとaを押した状態でz)すると、今度は行を入れ替えたとしても必ず「a & z」と表示されます。
このことから、コンビネーションキーに書いたことが優先的に実行されると考えられます。
3キー同時押しのホットキーを定義するときに注意
つまり、たとえばCtrlと無変換を修飾キー(prefix key)として利用し、「Ctrl+k」「無変換+k」、「Ctrl+無変換+k」をそれぞれ別々に独立して制御したい場合、「^k::」と「vk1Dsc07B & k::」を書いて二つ同時押し(「Ctrl+k」と「無変換+k」)、どちらかの中で三つ同時押しの動作を定義することになります。これは、Ctrl、Alt、Shift、Win以外のキーを二つ以上含む三つ同時押しを直接定義する方法がAutoHotkeyには存在しないからです。
つまり、「^k::」側に書く方式
^k:: If GetKeyState("vk1Dsc07B", "P") msgbox, "Ctrl+無変換+k" Else msgbox, "Ctrl+k" Return vk1Dsc07B & k::msgbox, "無変換+k"
と、「vk1Dsc07B & k::」側に書く方式
^k::msgbox, "Ctrl+k" vk1Dsc07B & k:: If GetKeyState("Ctrl", "P") msgbox, "Ctrl+無変換+k" Else msgbox, "無変換+k" Return
が考えられるのですが、どちらにせよ、3つのキー(Ctrl,無変換,k)を同時押ししたときに実行されるのは「^k::」ではなく「vk1Dsc07B & k::」なのです。つまり、後者が正解で、前者は間違いとなります(前者を実行して三つ同時押しをしても、「無変換+k」が表示されてしまいます)
まとめ
AutoHotkeyには、このような優先順序があるようです。例に挙げたように、特に3キー同時押しを細かく制御しようとする場合には注意が必要です。ちなみに、ここで細かく、と言っているのは、
vk1Dsc07B & k:: Send, {Blind}{Left}
のように、CtrlキーなどのUp/Downを素通ししてしまうことで3キー同時押しを行うことも出来るからです。ただし、これでは制限が非常にきついので、本文中で紹介したような方法が必要になると思います。
3キー同時押しのうまいやり方が本当にこれなのかは分かりません。もっといい3キー同時押し方法があるのかもしれません。ただ、とりあえずこういうことが起こるということに気がついて、実際にはまってしまったのでメモしておきました。落とし穴うめうめ。
Windowsダンプの極意 エラーが発生したら、まずダンプ解析!Advanced Windows 第5版 上 (マイクロソフト公式解説書)
インサイド Microsoft Windows 第4版〈上〉 (マイクロソフト公式解説書)
APIで学ぶWindows徹底理解