AutoHotKeyのキー修飾の「$」を見ると下記のような説明が書いてあるが、正直分かりにくい。
RegisterHotkey()ではなく、強制的にキーボードフックでイベントを取得する。(NT系専用)
サブルーチン内でそのホットキー自身を送信する場合、RegisterHotkey()ではホットキーイベントが再帰的に呼び出されてしまう。
#UseHook指令を使えば、$を省略できる。
http://ahkwiki.net/Hotkeys
というわけで、実際に動作検証。
例えば下記のように設定して、wキーを押すと、「qry-ac-ddffZ」と出力される。
w::Send qwerty e::Send -abbc t::Send -ddbbff b::Send Z
AutoHotKeyはSendで出したキー出力も入力として受け付けるみたいなので、
- wキーが押される
- Sendが起動「q」「w」「e」「r」「t」「y」を出力。
- キーバインドが設定されてる「w」「e」「t」は処理が保留。それ以外の「q」「r」「y」はそのまま出力
- 「w」「e」「t」の処理が開始
- 1つの処理の中で、一度実行されたキーバインドは再実行されない仕様のようなので、「w」は破棄。
- 「e」の処理開始。キーバインド設定がある「b」を除き出力。「b」の処理はプール。
- 「t」の処理開始。「e」と同様に処理。
- 「b」の処理を実行
という感じの処理をしてるみたい。
「$」を先頭につけると、付けたキーバインドはSendが出したキー入力だと動かなくなる。下記のように「$」を付けると、「qwry-abbc-ddbbff」という感じで出力される。
$w::Send qwerty e::Send -abbc t::Send -ddbbff $b::Send Z
一つずつ「$」付けるのが面倒な場合、#UseHook Onと記述すると、以降のコードは「$」を付けたのと同じことになる。外す場合は#UseHook Offでオフになる。
例えば、下記のように書いてwを押すと、「qwery-ddffZ」と出力される。
#UseHook On w::Send qwerty e::Send -abbc #UseHook Off t::Send -ddbbff b::Send Z
UseHookの説明見ると、
AutoHotkeyではホットキーの登録はデフォルトで RegisterHotkey() というウィンドウズAPIを使用して行われる。このAPIで登録できないホットキーだけをフックを使って実現している。しかし、ホットキーラベル定義で
$
オプションをつけるか、#UseHook を使用すると、どんなホットキーでもフックを使うようになる。フックを使用すると、RegisterHotkey()を使用するより反応が速くなる場合がある。
http://ahkwiki.net/-UseHook
と書いてある。
不必要なバインドが誤爆すると困る、速度向上も期待できそうなので、基本的に#UseHook Onとして使うほうが良さそう。
コメント
UseHookの意味がわからなかったのですが、こちらの解説を読んで理解できました。
解りやすい解説でとても参考になりました。ありがとうございました!