# #IfWinActive / #IfWinNotActive / #IfWinExist / #IfWinNotExist

创建上下文相关的热键和热字串. 这样的热键会根据窗口是否活动或存在的情况执行不同的动作(或什么都不做).

    #IfWinActive WinTitle, WinText
    #IfWinExist WinTitle, WinText
    #IfWinNotActive WinTitle, WinText
    #IfWinNotExist WinTitle, WinText
    #If , Expression

## 参数

WinTitle

  窗口标题或识别目标窗口的其他条件. 请参阅 WinTitle.

  匹配行为由自动执行段中设置的 SetTitleMatchMode 决定.

  和其他大多数指令一样, 不支持变量. 尽管可通过 ahk_pid 和 ahk_id 使用硬编码的进程或窗口 ID, 不过直接通过 GroupAdd 或 Hotkey IfWin 使用 #IfWin 更常见.

WinText

  如果使用此参数, 那么它必须是目标窗口中单个文本元素的子字符串(和内置的 Window Spy 工具显示的一样). 只有在自动执行段(脚本的顶部) 中打开 DetectHiddenText 设置时, 这样会检测到隐藏文本元素.

ExcludeTitle, ExcludeText

  尽管这些不受支持, 但是通过在 WinTitle 中指定 `ahk_group MyGroup` 可以间接地使用它们(此处 MyGroup 是由 GroupAdd 建立的窗口组; 它支持 ExcludeTitle/Text).

## 基本操作

#IfWin 指令可以简单地创建上下文相关的热键和热字串. 例如:

    #IfWinActive ahk_class Notepad
    #space::MsgBox You pressed Win+Spacebar in Notepad.

#IfWin 指令是与位置有关的: 它们会影响脚本中实际在它们后面的所有热键和热字串. 它们也是互斥的; 即只有最近的那个会起作用.

要关闭上下文相关性, 请指定任一 #IfWin 指令但省略所有参数. 例如:

    #IfWinActive

当 #IfWin 关闭时(或从未在脚本中使用), 所有的热键和热字串对所有的窗口有效(除非使用 Suspend 或 Hotkey 命令进行禁用).

使用 #IfWin 禁用鼠标或键盘热键后, 它会执行它原来的功能, 即会直接被传递到活动窗口, 就像不存在这样的热键. 有一种情况例外: 对于操纵杆热键, 尽管 #IfWin 有效, 但它不能阻止其他程序探测到按钮的按下动作.

#IfWin 还可以用来改变普通按键的行为, 例如 `Enter` 或 `Space`. 这可以用于特殊的窗口忽略那个按键或执行您不希望的其他动作时. 例如:

    #IfWinActive Reminders ahk_class #32770  ; Outlook 中的 "提醒" 窗口.
    Enter::Send !o  ; 让 "Enter" 键打开选择的提醒.
    #IfWinActive

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

## 变体(副本) 热键

在脚本中特殊的热键或热字串可以使用不同的 #IfWin 条件定义多次. 这被称为 热键变体. 例如:

    #IfWinActive ahk_class Notepad
    ^!c::MsgBox You pressed Control+Alt+C in Notepad.
    #IfWinActive ahk_class WordPadClass
    ^!c::MsgBox You pressed Control+Alt+C in WordPad.
    #IfWinActive
    ^!c::MsgBox You pressed Control+Alt+C in a window other than Notepad/WordPad.

如果有多个变体符合触发条件, 那么只有最接近脚本顶部的那个会触发. 例外的情况是全局变体(不含 #IfWin 条件的变体): 它的优先级总是最低; 因此, 只有在没有其他变体符合条件时才会触发它(这种例外情况不适用于热字串).

创建重复热键时, 修饰符的顺序例如 ^!+# 没有关系. 例如: `^!c` 等效于 `!^c`. 但是, 按键必须拼写一致. 例如, 用于此目的时 Esc 与 Escape 是有区别的(尽管不会受大小写形式的影响). 同样, 含通配符前缀(*) 的热键和不含通配符的是完全独立的; 例如, `*F1` 和 `F1` 每个都有自己的变体集.

要让多个变体执行相同的热键子程序, 最简单的方法是把同个热键的变体叠放在一起, 其中在每个的前面使用不同的 #IfWin 指令. 例如:

    #IfWinActive ahk_class Notepad
    #z::
    #IfWinActive ahk_class WordPadClass
    #z::
    MsgBox You pressed Win+Z in either Notepad or WordPad.
    return

或者通过 `#IfWinActive ahk_group MyGroup` 使用窗口组.

要动态创建热键变体(在脚本运行时), 请参阅 "Hotkey IfWin".

## 一般说明

#IfWin 还能在适当时恢复前缀键为它们原来的功能(在 "a & b" 这样的热键中前缀键为 `A`). 每当组合键中给定的前缀没有启动热键时会发生这样的情况, 即前缀键恢复为原来的功能.

当使用 Gosub 或 Goto 跳转到热键或热字串标签时, 它会跳转到最接近脚本顶部的变体.

当前被 #IfWin 禁用的热键, 其中的按键或鼠标按钮在 KeyHistory 的 "Type" 列中显示时会带有 "#" 字符. 这样可以帮助调试脚本.

当前不支持变量引用, 例如 %Var%. 因此, 百分号必须转义为 `% 以便在将来支持它们. 同样, 原义的逗号必须进行转义(为 `,) 以便在将来增加额外的参数. 如果您需要解决此限制, 请使用 GroupAdd 和 ahk_group.

由 Hotkey 命令设置的热键的标签不会直接受 #IfWin 影响. 相反地, 在靠近脚本的底部使用 #IfWin 会影响所有由 Hotkey 命令创建的热键(除非使用 "Hotkey IfWin" 改变了这种行为).

Alt-tab 热键不受 #IfWin 影响: 它们总是对所有窗口有效的.

#IfWinActive/Exist 会设置最近找到的窗口(但不包括 #IfWinNotActive/NotExist). 例如:

    #IfWinExist ahk_class Notepad
    #n::WinActivate  ; 激活由 #IfWin 找到的窗口.

如果 #IfWin 的某个参数中含有前导或尾随的空格/制表符, 需要使用转义序列 `s 和 `t 代替.

由于性能的原因, #IfWin 不会持续监视指定窗口的激活或存在. 相反地, 它只会在您输入热键或热字串时检查匹配窗口. 如果匹配窗口不存在, 那么您的键击或鼠标点击会原样传递给活动窗口.

窗口标题和文本是区分大小写的. 只有在自动执行段(脚本的顶部) 中打开 DetectHiddenWindows 设置时, 才能检测到隐藏窗口.

## 相关

#If 表达式, Hotkey 命令, 热键, 热字串, Suspend, WinActive(), WinExist(), SetTitleMatchMode, DetectHiddenWindows

## 示例

创建两个热键和一个热字符串, 只有在记事本处于活动状态时才能使用, 而一个热键则适用于除记事本以外的任何窗口.

    #IfWinActive 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.
    #IfWinActive
    #c::MsgBox You pressed Win-C in a window other than Notepad.

dftg