# #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%.

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

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

    #If

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

## 一般说明

当键盘, 鼠标或操作杆按钮组合形成的热键被按下时, 计算 #If 表达式的值, 以确定热键是否应该激活.

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

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

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

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

- 键盘或鼠标输入通常被缓冲(延迟), 直到表达式计算完成或超时.
- 表达式的计算只能由脚本的主线程(在操作系统级别, 而不是准线程) 执行, 而不是由键盘/鼠标钩子直接执行. 如果脚本忙或者没有响应, 比如在进程中出现了 FileCopy, 那么表达式的计算就会被延迟, 并且可能会超时.
- 如果达到系统定义的超时, 系统可能会停止通知脚本键盘或鼠标输入(有关详细信息, 请参阅 #IfTimeout).
- 在计算表达式时, 发送击键或鼠标单击(例如, 从它调用的函数中), 可能会导致并发, 应该避免.

[AHK_L 53+]: A_ThisHotkey 和 A_TimeSinceThisHotkey 是基于当前正在计算的 #If 表达式的热键来设置的.

[v1.0.95.00+]: A_PriorHotkey 和 A_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

dftg