#If

AutoHotKey

#If [AHK_L]

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

#If [, Expression ]

参数

Expression

任何有效的 表达式.

基本操作

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

#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 或任一 #IfWin 指令. 例如:

#If

一般说明

当按下由按键组合形成的热键时, #If 表达式的计算结果决定了是否激活热键. 只有在表达式计算完成或超时后,系统才会响应键盘或鼠标输入.在计算这个表达式过程中(例如来自它所调用的函数)发送键击或鼠标点击可能导致复杂的情况,应该避免这样做.

当程序需要知道某个热键是否处于活动状态时,#If 后面的表达式可能会再次计算一次.例如,有一个 #If 表达式作用于一个普通的组合热键 a & b:: ,当按下前缀按键 (这个例子中前缀按键是a)时,表达式将会计算一次,计算结果将决定是否激活该组合热键.

由于前面所说的原因,应该把这个表达式设计为尽快结束并且不会产生副作用.

[AHK_L 53+]: A_ThisHotkeyA_TimeSinceThisHotkey 的设置是基于某个 #If 表达式正在计算中的热键.

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

相关

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

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

示例

; 示例 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: 动态热键定义. 依赖示例 1.
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