[AHK]$(ドルマーク)の効果検証

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で出したキー出力も入力として受け付けるみたいなので、

  1. wキーが押される
  2. Sendが起動「q」「w」「e」「r」「t」「y」を出力。
  3. キーバインドが設定されてる「w」「e」「t」は処理が保留。それ以外の「q」「r」「y」はそのまま出力
  4. 「w」「e」「t」の処理が開始
  5. 1つの処理の中で、一度実行されたキーバインドは再実行されない仕様のようなので、「w」は破棄。
  6. 「e」の処理開始。キーバインド設定がある「b」を除き出力。「b」の処理はプール。
  7. 「t」の処理開始。「e」と同様に処理。
  8. 「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として使うほうが良さそう。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です