#If

提供: AutoHotkey Wiki
移動: 案内検索

実行制御 | GUI表示 | 演算・変数 | メモリ・DLL操作 | 文字列操作 | キーボード | マウス | シェル | ウィンドウ | ウィンドウグループ
ステータスバー | コントロール | サウンド | ファイル | INIファイル | レジストリ | 環境変数 | AutoHotkey | その他 | 設定関係 | オブジェクト

#If [AHK_L][編集]

AHKL 文脈依存のホットキーや、ホットストリングを定義できる。 式の評価結果に従ってホットキー等が実行されるかされないかを決めることができる。

#If [, Expression ]

Parameters[編集]

引数名 説明
Expression 任意の有効な式

Basic Operation[編集]

スクリプト内の特定の位置に記述されたホットキーが有効かどうかを、式を用いることで定義できる。

#If WinActive("ahk_class Notepad") or WinActive(MyWindowTitle)
#Space::MsgBox You pressed Win+Spacebar in Notepad or %MyWindowTitle%.

#IfWin~ ディレクティブに似て、#If は位置を指し示すもので、以降のスクリプトに記述されたホットキーとホットストリングが有効かどうかに影響を与える。つまり #If#IfWin~ は排他的であって、直上の #If または #IfWin~ が実効性を持つ。

この影響を無くすには、「#If」または「#IfWinActive」のようにパラメタのないディレクティブを記述する。

#If

Remarks[編集]

ホットキー押下によってキーの組み合わせが発生した場合、#If によって該当のホットキーを有効とするかどうかの評価を行う。すなわち、式の評価が完了するかタイムアウトするまでの間は、システムはキーボード入力に対して反応を示さないことがある。

AutoHotkeyの気まぐれな設計思想のせいか、#If が二度評価される場合がある。このため、#If は副作用を持たないように設計すべきである。 [L59]にて修正済

#IfWin~ では指定のウィンドウが LastFoundWindow として記憶され、WinGet~, WinSet~, ControlGet~, Control, ControlSend などのコマンドで、ウィンドウやウィンドウ内のコンポーネントの情報取得や操作を行う際には引数 WinTitle を指定しなくても良い。

#IfWinExist, ahk_class Notepad
^!+n::WinActivate                    ; LastFoundWindow が適応される

一方、#If の場合は単なる式を指定するだけでウィンドウを特定していないので(たとえ「#If WinExist(WinTitle)」のようにしていたとしても)、LastFoundWindow は記憶されないため、先に挙げたコマンドでは適宜 WinTitle を指定してやる必要がある。

#If WinExist("ahk_class Notepad")
^!+n::WinActivate, ahk_class Notepad ; LastFoundWindowは無いのでWinTitleを指定する

[AHK_L 53+] A_ThisHotkeyA_TimeSinceThisHotkey は現在 #If が対象としているホットキーに基づいて設定される。
[v1.0.95.00+] A_PriorHotkey and A_TimeSincePriorHotkey temporarily contain the previous values of the corresponding "This" variables.

Related[編集]

#IfWinActive系の挙動に関する点の殆どが #If にも該当する。

#IfTimeout を用いることでデフォルトのタイムアウト値を変更することができる

文脈依存のホットキーをHotkeyコマンドで定義したい場合は、「Hotkey, If, (式)」のようにして条件を指定する。 (式)は"#If"を除いたものでなければならない。 "If"に続くカンマは必須。以下の例4を参照のこと。

Example(s)[編集]

例1) タスクバー上でホイール回転することで音量変更をする。

#If MouseIsOver("ahk_class Shell_TrayWnd")
WheelUp::Send {Volume_Up}
WheelDown::Send {Volume_Down}

MouseIsOver(WinTitle) {
    MouseGetPos,,, Win
    Return WinExist(WinTitle . " ahk_id " . Win)
}

例2) 全てのエディットコントロールで単語削除を行う。

#If ActiveControlIsOfClass("Edit")
^BS::Send ^+{Left}{Del}
^Del::Send ^+{Right}{Del}

ActiveControlIsOfClass(Class) {
    ControlGetFocus, FocusedControl, A
    ControlGet, FocusedControlHwnd, Hwnd,, %FocusedControl%, A
    WinGetClass, FocusedControlClass, ahk_id %FocusedControlHwnd%
    Return (FocusedControlClass=Class)
}

例3) 文脈に依存しないホットキー

#If
Esc::ExitApp

例4) ダイナミックホットキー

NumpadAdd::
Hotkey, If, MouseIsOver("ahk_class Shell_TrayWnd")
If (doubleup := !doubleup)
    Hotkey, WheelUp, DoubleUp
Else
    Hotkey, WheelUp, WheelUp
Return

DoubleUp:
Send {Volume_Up 2}
Return