#IfWinActive / #IfWinExist


创建上下文相关的 热键 和 热字符串 。这样的热键视某类窗口的激活或存在而执行一个不同的动作 (或根本不执行) 。

#IfWinActive [, WinTitle, WinText]
#IfWinExist [, WinTitle, WinText]
#IfWinNotActive [, WinTitle, WinText]
#IfWinNotExist [, WinTitle, WinText]

参数

WinTitle 目标窗口的标题或部分标题 (匹配模式由设置在 自动执行部分 里的 SetTitleMatchMode 决定)。要使用一个窗口类,指定 ahk_class 确切的ClassName (通过 Window Spy 显示的)。要使用一个 窗口组 ,指定 ahk_group GroupName 。也支持 ahk_pid 和 ahk_id 关键词,但对 #IfWin 来说更常见的是通过 GroupAdd 间接地使用它们(或者,使用 "Hotkey IfWin")。最后,通过指定 多个条件 可以缩小搜索范围。例如:My File.txt ahk_class Notepad
WinText 如果有的话,此参数必须是目标窗口的单独文本对象中的子字符串 (像内含的 Window Spy 工具显示的那样)。如果 DetectHiddenText 在自动执行部分(脚本的顶部)已被开启,隐藏的文本对象会被探测到。
ExcludeTitle
ExcludeText
虽然这些被支持,但它们能间接地通过指定 ahk_group MyGroupWinTitle 来使用(在那通过 GroupAdd 创建 MyGroup ,它支持 ExcludeTitle/Text)。

基本的操作

#IfWin 指令能简单地创建上下文相关的 hotkeyshotstrings 。例如:

#IfWinActive ahk_class Notepad
#space::MsgBox 你在记事本中按了 Win+空格 。

#IfWin 指令是位置相关的:它们影响脚本中在它们下面的所有热键和热字符串。它们也是互斥的;也就是说,只有最近的一个才会生效。

要关闭上下文制约,指定任意 #IfWin 指令但省略它所有的参数。例如:

#IfWinActive

当 #IfWin 关闭时 (或没用在脚本中),所有的 热键 和 热字符串 对所有的窗口都有效 (除了被 Suspend 或 Hotkey 命令 禁用)。

当一个鼠标或键盘热键被 #IfWin 条件限制时,它执行它本来的功能;也就是说,它传递到激活的窗口时就仿佛没有那么一个热键。有两个例外: 1) Windows 95/98/Me: 按一个 IfWin-禁用的 热键没有任何效果 (甚至没有它本来的功能); 2) 操纵杆热键: 虽然 #IfWin 可用,但它不能阻止其他程序探测按钮的按动。

#IfWin 也能用来改变一个普通的按键像 Enter 或 空格 的表现。这在一个特殊的窗口忽略那个按键或执行一些你发觉不想要的动作时很有用。例如:

#IfWinActive Reminders ahk_class #32770  ; 在 Outlook 里的 "reminders" 。
Enter::Send !o  ; 让 "Enter" 键击打开选择的 reminder 而不是让它睡觉。
#IfWinActive

变体 (重复的) 热键

一个特定的 热键 或 热字符串 能在脚本中定义多次,假如每个定义都有不同的 #IfWin 条件。这些被称作 hotkey variants(热键变体)。例如:

#IfWinActive ahk_class Notepad
^!c::MsgBox 你在记事本中按了 Control+Alt+C 。
#IfWinActive ahk_class WordPadClass
^!c::MsgBox 你在写字板中按了 Control+Alt+C 。
#IfWinActive
^!c::MsgBox 你在不是记事本/写字板的窗口中按了 Control+Alt+C 。

如果有多个(译注:即条件不同但热键相同)变体适合被激发,那么只有最接近脚本顶部的那个会被激发。除此之外是全局的变体 (没有 #IfWin 条件): 它总是最低的优先级;因此,它只在没有其他合适的变体的时侯才会激发 (这个例外不适用于 热字符串)。

在创建重复的热键时,修饰键符号 例如 ^!+# 的顺序没有关系。例如,^!c 和 !^c 是一样的。不过按键必须拼写一致。例如,为了这种目的, EscEscape 是不一样的(然而大小写没关系)。同样,任何带 通配符前缀 (*) 的热键完全和一个没有通配符的有区别;例如,*F1 和 F1 每个都将会有它们自己的一组变体。

要让同个热键的子程序通过多个变体执行,最简单的方法就是创建一堆相同的热键,每个热键都有不同的 #IfWin 指令在它上面。例如:

#IfWinActive ahk_class Notepad
#z::
#IfWinActive ahk_class WordPadClass
#z::
MsgBox 你在记事本或写字板中按了 Win+Z 。
return

或者,通过 #IfWinActive ahk_group MyGroup 使用一个 窗口组

要动态地创建热键变种 (当脚本在运行时),请看 "Hotkey IfWin"

一般说明

#IfWin 也能在前缀按键被占用时还原它们本来的功能 (在一个热键像 "a & b" 中 前缀按键 是 "a" 键)。这用在没有给一个特定的前缀指定可用的热键时。

当 Gosub 或 Goto 被用来跳转到一个热键或热字符串标识时,它跳转到最接近脚本顶部的那个变体。

当一个热键当前被 #IfWin 限制时,它的按键或鼠标按钮会用一个 "#" 符号出现在 KeyHistory 的 "Type" 列里。这能帮助调试一个脚本。

当前不支持例如 %Var% 的变量引用。因此,百分号必须通过 `%  转义 来允许将来支持它们。同样,原义的的逗号必须被转义 (通过 `,) 来允许附加的变量在将来被添加。如果你需要绕弯解决这种限制,使用 GroupAddahk_group

Hotkey 命令 指定热键的 label 不直接被 #IfWin 影响。取而代之的是,在最接近脚本底部使用的 #IfWin  (如果有的话) 将影响所有由 Hotkey 命令创建的热键 (除非使用 "Hotkey IfWin" 来改变)。

Alt-tab 热键 不受 #IfWin 影响: 它们在所有的窗口有效。

最后找到的窗口 可被 #IfWinActive/Exist 设置(但是不被 #IfWinNotActive/NotExist 设置)。例如:

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

如果在 #IfWin 的某个变量里需要开头或结尾空格,转义顺序 `s 和 `t 可以被使用。

由于性能的原因,#IfWin 不会持续监视指定窗口的激活或存在。取而代之的是,它只在你输入一个热键或热字串时才去核查匹配窗口。如果匹配的窗口不存在,你的键击或鼠标点击会被允许传递给没变的激活窗口 (除了在 Windows 95/98/Me 上)。

Windows 95/98/Me: 如果热键的首个变体有一个 $ 前缀,所有的变体将被允许 "发送它们本身" 。这为一个热键去执行它原来的功能提供了一种方法而不是完全什么也不做。例如:

$^a::Send ^a  ; 首个变体必须有一个 $ 前缀来允许它在 Windows 9x 上 "发送自身"。
#IfWinActive ahk_class Notepad
^a::MsgBox 你在记事本激活时按了 Control-A 。

窗口标题和文本是区别大小写的。隐藏的窗口不被探测,除非 DetectHiddenWindows 在自动执行部分 (脚本顶部) 被开启。

相关命令

Hotkey command, Hotkeys, Hotstrings, Suspend, IfWinActive, IfWinExist, SetTitleMatchMode, DetectHiddenWindows

示例

#IfWinActive ahk_class Notepad
^!a::MsgBox 在记事本激活时你按了 Ctrl-Alt-A 。 ; 此热键如果在别的窗口按是无效的 (它将 "pass through"[经过] )。 #c::MsgBox 在记事本激活时你按了 Win-C 。 ::btw::此 "btw" 的替换文本将只在记事本里出现。 #IfWinActive #c::MsgBox 在一个不是记事本的窗口里你按了 Win-C 。
翻译:天堂之门 menk33@163.com 2008年8月27日