这是被 IfWin[Not]Exist, IfWin[Not]Active, WinWait[Not]Active 或 WinWait 命令最近找到的窗口。由于不需要在各种窗口命令里再重复目标窗口的 WinTitle 和 WinText 参数,所以它可以使脚本更易于创建和维护。此外,因为在首次找到目标窗口后不需要再将其搜寻一遍,所以脚本执行得更好。
所有窗口命令都可以使用“最近找到”的窗口,除了 WinWait, WinActivateBottom 和 GroupAdd。要使用它的话,只需省略掉全部的四个窗口参数(WinTitle, WinText, ExcludeTitle 和 ExcludeText)。
每个线程都保留了它自有的“最近找到”窗口的值,就是说如果当前线程被另一个线程打断,那么在原来的线程恢复时,它仍将保持它原本的“最近找到”窗口的值,而不是那个中断它的线程的值。
如果最近找到的窗口是一个隐藏的 Gui 窗口,那么即使在 DetectHiddenWindows 处于 Off 状态时,它也能被使用。这常与"Gui +LastFound"一起使用。
示例
Run Notepad WinWait 无标题 - 记事本 WinActivate ;使用最近找到的窗口。 IfWinExist, 无标题 - 记事本 { WinActivate ;自动地使用上面找到的窗口。 WinMaximize ;同上 Send, Some text.{Enter} return } IfWinNotExist, 计算器 return else { WinActivate ;上面的 "IfWinNotExist" 也为我们设置了“最近找到”的窗口。 WinMove, 40, 40 ;将它移动到一个新的位置。 return }
如果有多种窗口符合一个窗口命令比如 WinMove 的 WinTitle/Text 条件,那么在窗口堆层次中位于其它窗口上面的那个窗口将被使用。例如,如果激活的/最前面的窗口匹配条件,就会用它,即使它下面还有其它匹配的窗口。
激活的窗口 (A): 几乎所有的窗口命令都能被告知对激活的窗口进行操作,只要指定它们的 WinTitle 参数为字母 A 并且省略掉 WinText, ExcludeTitle 和 ExcludeText。在下例中,Win+上箭头 变成一个最大化当前激活窗口的热键: #Up::WinMaximize A
窗口类 (ahk_class): 通过 Window Spy 显示的或者由 WinGetClass 获得的类名都能使所有的窗口命令对一个窗口类进行操作。在下例中,一个分割视图的资源管理器窗口(译注:即左侧为文件夹树)将被激活: WinActivate ahk_class ExploreWClass
唯一 ID/HWND (ahk_id): 通过唯一 ID 编号,所有的窗口命令都能对特定的窗口或者控件进行操作。例如:WinActivate ahk_id %VarContainingID%。一个窗口的 ID 一般通过 WinExist() 或者 WinGet 来取得。一个控件的 ID 一般通过 ControlGet Hwnd, MouseGetPos 或 DllCall 来取得。而且,即使控件是隐藏的,ahk_id 也将对它们进行操作;就是说,DetectHiddenWindows 的设置无关紧要。
进程 ID (ahk_pid): 所有的窗口命令都能对属于一个进程标识符(PID)的窗口进行操作。例如,WinClose ahk_pid %VarContainingPID% 会关闭那个进程的最上层窗口。PID 能通过 WinGet 或 Run 或 Process 来获得。
窗口组 (ahk_group): 通过给 WinTitle 参数指定 ahk_group MyGroupName,所有的窗口命令都能对属于一个窗口组的窗口进行操作。WinMinimize, WinMaximize, WinRestore, WinHide, WinShow, WinClose 和 WinKill 命令会对组内所有的窗口起作用。相比之下,其它窗口命令例如 WinActivate 和 IfWinExist 将只对组内最上层的窗口进行操作。
多重条件: 和上面段落中的 ahk_group (其扩大了搜索)相比,只要在 WinTitle 参数中指定多个条件就能缩小搜索范围。在下例中,脚本等待标题包含 My File.txt 以及类是 Notepad 的窗口出现:
WinWait My File.txt ahk_class Notepad
WinActivate ;激活它找到的窗口。
当使用这方法时,应该首先列出标题的文字(如果有的话就需要),后跟一个或多个附加的条件。超出首个的条件必须精确地用一个空格或者 tab 来与前一个分开(任何其他的空格或 tab 将被看作前一个条件的一部分)。
翻译:天堂之门 menk33@163.com 2008年11月5日