#Ifディレクティブによる文脈依存ホットキー
#if
ディレクティブを用いることにより、複雑な条件で活性化するホットキーを指定することができる。
#If
での判定はIf ()
と同じで、単純な式および関数の戻り値を利用することができる。
関数の戻り値を利用する最も単純な用例としては、WinActive()
関数をor
条件で並列し、複数のウィンドウで有効なホットキーを指定するものがある。(ahk_group
による指定でもよいが、対象ウィンドウが2つ程度ならこちらのほうが簡易である)
以下は#If - AutoHotkey Wikiから引用。
# If WinActive("ahk_class Notepad") or WinActive(MyWindowTitle)
# Space::MsgBox You pressed Win+Spacebar in Notepad or %MyWindowTitle%.
マウスカーソル位置によるマウスボタンホットキー(マウスジェスチャー)
特にマウスボタンで発動するホットキー(マウスジェスチャー)においては、(アクティブウィンドウによる指定ではなく)マウスカーソルが指定の位置にある場合のみ活性化させたい場合がある。
しかし、組み込み変数および組み込み関数では、マウスカーソルの現在位置を評価することができない。
マウスカーソル位置はリアルタイムに変動するものであるため、ホットキー実行時にユーザー定義関数によって評価することが適切である。
同じく#If - AutoHotkey Wikiからの引用となるが、以下の例では、ユーザー定義関数MouseIsOver()
によって、マウスカーソル直下のウィンドウハンドルを評価している。
# If MouseIsOver("ahk_class Shell_TrayWnd")
WheelUp::Send {Volume_Up}
WheelDown::Send {Volume_Down}
MouseIsOver(WinTitle) {
MouseGetPos,,, Win
Return WinExist(WinTitle . " ahk_id " . Win)
}
ただし、これではマウスカーソルが指定ウィンドウの指定コントロール上にある場合といった条件付けができない。(具体的には、「メモ帳のテキスト入力部分」とか「ブラウザのページレンダリング部分」とか)
このような場合、MouseGetPos
コマンドで、マウスカーソル直下のコントロール名を取得すればよい。
以下の例では、「アクティブウィンドウがメモ帳」かつ「マウスカーソル直下がメモ帳のテキスト入力部分」である場合に、右クリックにCtrl+S(保存)を割り当てている。
タスクバー上などは対象外であるため、例えば「タスクバーを右クリックして最大化」は通常通り可能である。
# If WinActive("ahk_class Notepad") && MouseIsOver("Edit1")
RButton::
Send, ^s
Return
MouseIsOver(UnderControl) {
MouseGetPos, , , , OutputVarControl,
Return (OutputVarControl = UnderControl)
}