#HotIf

文脈依存のホットキーホットストリングを作成します。このようなホットキーは、任意の条件()に応じて異なるアクションを実行します(または全く実行されません)。

#HotIf Expression

パラメータ

型:論理値

If omitted, subsequently-created hotkeys and hotstrings are not context-sensitive. Otherwise, specify any valid expression. これは、1つのパラメータ(ThisHotkey)を持つ暗黙の関数の戻り値になります。この関数はグローバル変数を直接変更することはできませんが(通常通り想定ローカルであり、宣言を含むことができないため)、グローバル変数を変更する他の関数を呼び出すことができます。

基本操作

#HotIfディレクティブは、その後に作成されるホットキーが起動するかどうかを決定するために使用される式を設定します。この式は、キー、マウスボタン、またはその組み合わせが押されたとき、またはプログラムがホットキーが有効かどうかを知る必要があるその他のときに評価されます。

文脈依存のホットキーホットストリングを作るには、単に#HotIfディレクティブを先行させればよい。事例:

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

#HotIf指令は位置指定:#HotIfは、次の#HotIfディレクティブまで、スクリプト内で物理的にその下にあるすべてのホットキーとホットストリングに影響を及ぼします。

注意: if文とは異なり、中括弧は#HotIf指示文では効果がありません。

文脈依存性をオフにするには、#HotIfを無表現で指定します。事例:

#HotIf

他のディレクティブと同様に、#HotIfは条件付きで実行することはできません。

マウスやキーボードのホットキーが#HotIfによって無効化されると、本来の機能を発揮します。つまり、そのようなホットキーがないかのように、アクティブウィンドウに通過します。ただし、1つだけ例外があります。Controller hotkeys:#HotIfは機能しますが、他の番組がボタンを押したところを見ることを防ぐことはできません。

#HotIfは、EnterSpaceなどの通常のキーの動作を変更するためにも使用できます。これは、特定のウィンドウがそのキーを無視したり、好ましくない動作をする場合に有効です。事例:

#HotIf WinActive("Reminders ahk_class #32770")  ; Outlookの "リマインダー "ウィンドウ。
Enter::Send "!o"  ; Enterキーを押すと、選択したリマインダーをスヌーズするのではなく、開くようにします。
#HotIf

バリアント(複製)ホットキー

A particular hotkey or hotstring can be defined more than once in the script if each definition has different HotIf criteria. これらは、ホットキーバリアントと呼ばれるものです。事例:

#HotIf WinActive("ahk_class Notepad")
^!c::MsgBox "You pressed Control+Alt+C in Notepad."
#HotIf WinActive("ahk_class WordPadClass")
^!c::MsgBox "You pressed Control+Alt+C in WordPad."
#HotIf
^!c::MsgBox "You pressed Control+Alt+C in a window other than Notepad/WordPad."

複数のバリアントが発射対象となる場合、スクリプトの先頭に最も近いものだけが発射されます。The exception to this is the global variant (the one with no HotIf criteria):常に最も低い優先順位を持つので、他の variant が適格でない場合にのみ発火します(この例外はホットストリングには適用されません)。

When creating duplicate hotkeys, the order of modifier symbols such as ^!+# does not matter. For example, ^!c is the same as !^c. ただし、キーは一貫したスペルで表記する必要があります。For example, Esc is not the same as Escape for this purpose (though the case does not matter). Also, any hotkey with a wildcard prefix (*) is entirely separate from a non-wildcard one; for example, *F1 and F1 would each have their own set of variants.

ウィンドウグループを使用すると、ウィンドウのグループに対してホットキーを実行させることができます。事例:

GroupAdd "MyGroup", "ahk_class Notepad"
GroupAdd "MyGroup", "ahk_class WordPadClass"

#HotIf WinActive("ahk_group MyGroup")
#z::MsgBox "You pressed Win+Z in either Notepad or WordPad."

ホットキーのバリエーションを動的に(スクリプトの実行中に)作成するには、HotIfを参照してください。

式評価

When the key, mouse or controller button combination which forms a hotkey is pressed, the #HotIf expression is evaluated to determine if the hotkey should activate.

注意:スクリプトは、キーが押されたときだけ式が評価されることを想定してはいけません(下記参照)。

この式は、プログラムがホットキーが有効かどうかを知る必要があるときに評価されることもあります。例えば、a & b:: のようなカスタムの組み合わせの #HotIf 式は、プレフィックスキー(この例ではa)が押されたときに評価され、カスタム修飾キーとして機能するかどうかを判断することができます。

注意:無反応のスクリプトで#HotIfを使用すると、入力ラグが発生したり、ホットキーが壊れたりすることがあります(下記参照)。

#HotIf指令には、さらにいくつかの注意事項があります。

ThisHotkeyA_ThisHotkeyA_TimeSinceThisHotkeyは、現在の#HotIf式が評価されているホットキーに基づき設定されます。

A_PriorHotkeyA_TimeSincePriorHotkeyは、対応する "This"変数の以前の値を一時的に保持します。

最適化

WinActiveWinExistの単純な呼び出しに対して、#HotIfは式の評価を避けるように最適化されており、そのような場合にラグなどの問題が発生するリスクを低減することができます。具体的:

これらの条件を満たす式は、プログラムによって直接評価され、ListLinesには表示されません。

Hotkey関数を使用して既存のホットキーバリアントを変更する前に、通常、HotIf関数を元の表現テキストで使用する必要があります。ただし、所定の条件の組み合わせを持つ最初のユニークな表現は、その条件によって参照することも可能です。事例:

HotIfWinExist "ahk_class Notepad"
Hotkey "#n", "Off"  ; ホットキーをオフにします。
HotIf 'WinExist("ahk_class Notepad")'
Hotkey "#n", "On"   ; 同じホットキーを再びオンにします。

#HotIf WinExist("ahk_class Notepad")
#n::WinActivate

なお、変数を使用した場合は、表現として失格となる。ホットキー作成後に変数の値が変化しない場合、ラグなど#HotIf特有の問題のリスクを最小化するための戦略が2つあります。

総論

また、#HotIfは、適切な場合、プレフィックスキーを本来の機能に戻します(プレフィックスキーは、a & bのようなホットキーのAです)。この現象は、指定したプリフィクスに対して有効なホットキーがない場合に発生します。

ホットキーが#HotIfによって現在無効になっている場合、そのキーまたはマウスボタンは、KeyHistoryの「タイプ」列に"#"文字で表示されます。This can help debug a script.

Alt-tabのホットキーは、#HotIfの影響を受けません。これらはすべてのウィンドウで有効です。

Last Found Windowは、#HotIfで設定することができます。事例:

#HotIf WinExist("ahk_class Notepad")
#n::WinActivate  ; WinExist()で見つかったウィンドウをアクティブにします。

#HotIfTimeoutを使用すると、デフォルトのタイムアウト値をオーバーライドすることができます。

Hotkey function, Hotkeys, Hotstrings, Suspend, WinActive, WinExist, SetTitleMatchMode, DetectHiddenWindows

メモ帳がアクティブなときにのみ機能する2つのホットキーと1つのホットストリング、およびメモ帳以外のウィンドウで機能する1つのホットキーを作成します。

#HotIf WinActive("ahk_class Notepad")
^!a::MsgBox "You pressed Ctrl-Alt-A while Notepad is active."
#c::MsgBox "You pressed Win-C while Notepad is active."
::btw::This replacement text for "btw" will occur only in Notepad.
#HotIf
#c::MsgBox "You pressed Win-C in a window other than Notepad."

タスクバー上でマウスホイールをスクロールして音量を調整できるようにします。

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

MouseIsOver(WinTitle) {
    MouseGetPos ,, &Win
    return WinExist(WinTitle " ahk_id " Win)
}

すべてのEditコントロールに、シンプルな単語削除ショートカットを搭載。

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

ActiveControlIsOfClass(Cls) {
    FocusedControl := 0
    try FocusedControl := ControlGetFocus("A")
    FocusedControlClass := ""
    try FocusedControlClass := WinGetClass(FocusedControl)
    return (FocusedControlClass=Cls)
}

文脈依存のホットキー

#HotIf
Esc::ExitApp

Dynamic Hotkeys. この例は、実行する前に例#2との組み合わせが必要です。

NumpadAdd::
{
    static toggle := false
    HotIf 'MouseIsOver("ahk_class Shell_TrayWnd")'
    if (toggle := !toggle)
        Hotkey "WheelUp", DoubleUp
    else
        Hotkey "WheelUp", "WheelUp"
    return
    ;ネストされた機能。	
DoubleUp(ThisHotkey) => Send("{Volume_Up 2}")
}