#IfWinActive / #IfWinExist
创建上下文相关的热键和热字串。这样的热键会根据窗口是否活动或存在的不同情况执行不同的动作(或什么都不做)。
#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)。
基本操作
"https://www.xnip.cn/doc/AutoHotkey-Hotkeys">热键 和 热字串. 例如:
#IfWinActive ahk_class Notepad #space::MsgBox You pressed Win+Spacebar in Notepad.
#IfWin 指令是与位置有关的: 它们会影响脚本中实际在它们后面的所有热键和热字串. 它们也是互斥的; 即只有最近的那个会起作用.
要关闭上下文相关性, 请指定任一 #IfWin 指令但省略所有参数. 例如:
#IfWinActive
当 "https://www.xnip.cn/doc/AutoHotkey-Hotkeys">热键 和 热字串 对所有的窗口有效 (除非使用 Suspend 或 Hotkey 命令 进行禁用).
使用 #IfWin 禁用鼠标或键盘热键后,它会执行它原来的功能,即会直接被传递到活动窗口,就像不存在这样的热键。有一种情况例外:对于操纵杆热键,尽管 #IfWin 有效,但它不能阻止其他程序探测到按钮的按下动作。
#IfWin 还可以用来改变普通按键的行为, 例如 Enter 或 Space. 这可以用于特殊的窗口忽略那个按键或执行您不希望的其他动作时. 例如:
"提醒" 窗口. Enter::Send !o ; 让 "Enter" 键打开选择的提醒. #IfWinActive
变体 (副本) 热键
在脚本中特殊的 热键 或 热字串 可以使用不同的 #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.
如果有多个变体符合触发条件, 那么只有最接近脚本顶部的那个会触发. 例外的情况是全局变体 (不含 "https://www.xnip.cn/doc/AutoHotkey-Hotstrings">热字串).
创建重复热键时, 修饰符 的顺序例如 ^!+"https://www.xnip.cn/doc/AutoHotkey-Hotkeys">通配符前缀 (*) 的热键和不含通配符的是完全独立的;例如,*F1
和 F1
每个都有自己的变体集。
要让多个变体执行相同的热键子程序, 最简单的方法是把同个热键的变体叠放在一起, 其中在每个的前面使用不同的 #IfWin 指令. 例如:
#IfWinActive ahk_class Notepad #z:: #IfWinActive ahk_class WordPadClass #z:: MsgBox You pressed Win+Z in either Notepad or WordPad. return
或者通过 "https://www.xnip.cn/doc/AutoHotkey-GroupAdd">窗口组。
要动态创建热键变体 (在脚本运行时), 请参阅 "Hotkey IfWin".
一般说明
"a & b" 这样的热键中 前缀键 为 "a" 键). 每当组合键中给定的前缀没有启动热键时会发生这样的情况, 即前缀键恢复为原来的功能.
当使用 Gosub 或 Goto 跳转到热键或热字串标签时, 它会跳转到最接近脚本顶部的变体.
当前被 "KeyHistory.htm">KeyHistory 的 "Type" 列中显示时会带有 "#" 字符. 这样可以帮助调试脚本.
当前不支持变量引用, 例如 %Var%. 因此, 百分号必须 转义 为 `% 以便在将来支持它们. 同样, 原义的逗号必须进行转义 (为 `,) 以便在将来增加额外的参数. 如果您需要解决此限制, 请使用 GroupAdd 和 ahk_group.
由 Hotkey 命令 设置的热键的标签不会直接受 "https://www.xnip.cn/doc/AutoHotkey-Hotkey">"Hotkey IfWin" 改变了这种行为).
Alt-tab 热键 不受 #IfWin 影响: 它们总是对所有窗口有效的.
"https://www.xnip.cn/doc/AutoHotkey-WinTitle">最近找到的窗口 (但不包括 #IfWinNotActive/NotExist). 例如:
#IfWinExist ahk_class Notepad #n::WinActivate ; 激活由 #IfWin 找到的窗口.
如果 "https://www.xnip.cn/doc/AutoHotkey-_EscapeChar">转义序列 `s 和 `t 代替.
由于性能的原因, #IfWin 不会持续监视指定窗口的激活或存在. 相反地, 它只会在您输入热键或热字串时检查匹配窗口. 如果匹配窗口不存在,那么您的键击或鼠标点击会原样传递给活动窗口。
窗口标题和文本是区分大小写的. 只有在自动执行段(脚本的顶部)中打开 DetectHiddenWindows 设置时,才能检测到隐藏窗口。
相关
https://www.xnip.cn/shouce/1165/74622.html, 热键, 热字串, Suspend, IfWinActive, IfWinExist, 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.