“最近找到”的窗口


这是被 IfWin[Not]Exist, IfWin[Not]Active, WinWait[Not]ActiveWinWait 命令最近找到的窗口。由于不需要在各种窗口命令里再重复目标窗口的 WinTitle 和 WinText 参数,所以它可以使脚本更易于创建和维护。此外,因为在首次找到目标窗口后不需要再将其搜寻一遍,所以脚本执行得更好。

所有窗口命令都可以使用“最近找到”的窗口,除了 WinWait, WinActivateBottomGroupAdd。要使用它的话,只需省略掉全部的四个窗口参数(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
}

WinTitle 参数的其他用法

如果有多种窗口符合一个窗口命令比如 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, MouseGetPosDllCall 来取得。而且,即使控件是隐藏的,ahk_id 也将对它们进行操作;就是说,DetectHiddenWindows 的设置无关紧要。

进程 ID (ahk_pid): 所有的窗口命令都能对属于一个进程标识符(PID)的窗口进行操作。例如,WinClose ahk_pid %VarContainingPID% 会关闭那个进程的最上层窗口。PID 能通过 WinGetRunProcess 来获得。

窗口组 (ahk_group): 通过给 WinTitle 参数指定 ahk_group MyGroupName,所有的窗口命令都能对属于一个窗口组的窗口进行操作。WinMinimize, WinMaximize, WinRestore, WinHide, WinShow, WinCloseWinKill 命令会对组内所有的窗口起作用。相比之下,其它窗口命令例如 WinActivateIfWinExist 将只对组内最上层的窗口进行操作。

多重条件: 和上面段落中的 ahk_group (其扩大了搜索)相比,只要在 WinTitle 参数中指定多个条件就能缩小搜索范围。在下例中,脚本等待标题包含 My File.txt 以及类是 Notepad 的窗口出现:

WinWait My File.txt ahk_class Notepad
WinActivate  ;激活它找到的窗口。

当使用这方法时,应该首先列出标题的文字(如果有的话就需要),后跟一个或多个附加的条件。超出首个的条件必须精确地用一个空格或者 tab 来与前一个分开(任何其他的空格或 tab 将被看作前一个条件的一部分)。

翻译:天堂之门 menk33@163.com 2008年11月5日