#If [AHK_L 4+]

创建上下文相关的热键热字串. 它们会根据表达式的结果执行不同的操作(或什么都不做).

#If Expression

参数

Expression

如果省略. 则随后定义的热键/热字串与上下文不相关. 否则, 请指定任何有效的表达式.

基本操作

任何有效的表达式可以用来定义激活热键/热字串的上下文. 例如:

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

#IfWin 指令一样, #If 是与位置有关的: 它会影响脚本中在它后面的所有热键/热字串. #If 和 #IfWin 是互斥的; 即只有最近的 #If 或 #IfWin 会起作用.

#If 用于通过双冒号语法定义的热键/热字串, 例如 #Space::::btw::. 对于通过 Hotkey 命令或 Hotstring 函数创建的热键/热字串, 请使用 Hotkey If. 但是, 如果 Hotkey If 从未在脚本中使用, 则最底部的 #If(如果有的话) 将对热键命令或 Hotstring 函数有效.

要关闭热键的上下文相关性, 指定一个不带任何参数的 #If 或任一 #IfWin 指令. 例如:

#If

和其他指令一样, #If 不能有条件地执行.

一般说明

当按下热键的键, 鼠标或控制器键组合或键入热字串的缩写时, 计算 #If 表达式的值, 以确定热键/热字串是否应该激活.

注意: 脚本不应该假定只有在按下热键的键时才计算表达式(见下文).

每当程序需要知道热键是否处于活动状态时, 也可以计算表达式. 例如, #If 表达式作用于一个自定义组合热键(如 a & b::), 当按下前缀按键(这个例子中的 a) 时, 表达式将会计算一次, 计算结果将决定是否对组合热键起作用.

注意: 在没有响应的脚本中使用 #If, 可能会导致输入延迟或中断热键/热字串(见下文).

#If 指令还有几个需要注意的问题:

[AHK_L 53+]: A_ThisHotkeyA_TimeSinceThisHotkey 是基于当前正在计算的 #If 表达式的热键或非自动替换热字串来设置的.

[v1.0.95.00+]: A_PriorHotkeyA_TimeSincePriorHotkey 临时包含对应的 "This" 变量的前一个值.

大部分 #IfWin 指令的行为属性也适用于 #If.

可以使用 #IfTimeout 覆盖默认的超时时间值.

示例

允许在任务栏上滚动鼠标来调节音量.

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

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

在所有的编辑控件中的轻松删除单词的快捷键.

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

与上下文不相关的热键.

#If
Esc::ExitApp

动态热键. 这个例子需要示例 #1 中的 MousIsOver 函数.

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