LoginSignup
3
3

More than 5 years have passed since last update.

[AutoHotKey]マウスカーソル位置に基づく文脈依存ホットキー

Last updated at Posted at 2017-06-01

#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)
}
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3