WinTitle 参数 & 最近找到的窗口

许多命令和一些函数中含有 WinTitle 参数用来标识要操作的窗口. 此参数可以为窗口的标题或部分标题及在此页面描述的其他条件.

快速参考
标题匹配行为
A活动窗口
ahk_class窗口类
ahk_id唯一 ID/HWND
ahk_pid进程 ID
ahk_exe进程名称/路径
ahk_group窗口组
 多重条件
(都为空)上次找到的窗口

匹配行为

SetTitleMatchMode 控制参数中的部分标题或完整标题与每个窗口标题的比较方式. 根据这个设置, WinTitle 可以为准确的标题或包含前面部分或标题任意位置的子字符串或正则模式. 这个设置还控制 ahk_classahk_exe 是否解释为正则模式.

窗口标题是区分大小写的, 除非在 RegEx 模式中使用 i) 修饰符.

只有在 DetectHiddenWindows 设置打开时才会检测到隐藏窗口, 不过 WinShow 总是能检测到隐藏窗口.

如果多个窗口匹配 WinTitle 及其他条件, 则使用最顶层的匹配窗口. 如果活动窗口匹配条件, 则它通常优先, 因为它一般在其他所有窗口的上面. 然而, 如果某个置顶窗口也匹配条件(且活动窗口没有置顶), 则使用这个置顶窗口.

活动窗口(A)

如果 WinTitle 为字母 A 且其他三个窗口参数(WinText, ExcludeTitleExcludeText) 都为空或省略, 则使用活动窗口.

; 获取活动窗口的 ID/HWND
id := WinExist("A")
MsgBox % id

; 按下 Win+↑ 来最大化活动窗口
#Up::WinMaximize, A

ahk_class 窗口类

窗口类是系统用来创建窗口的模板的属性集. 换句话说, 窗口类表示窗口的类型. 要使用窗口类, 请根据 Window Spy 显示的指定 ahk_class ExactClassName. 可以用 WinGetClass 获取 ExactClassName.

如果启用了正则的标题匹配模式, 则 ahk_class 接受正则表达式.

; 激活命令行窗口 (例如 cmd.exe)
WinActivate, ahk_class ConsoleWindowClass

ahk_id 唯一 ID / HWND

每个窗口或控件都含有唯一 ID, 也称为 HWND(即窗口句柄的缩写). 即使在窗口或控件的标题改变时也可用这个 ID 来识别它. 窗口的 ID 通常使用 WinExist()WinGet 获取. 控件的 ID 通常使用 ControlGet Hwnd, MouseGetPosDllCall() 获取. 此外, ahk_id 甚至可以操作于隐藏控件, DetectHiddenWindows 的设置不影响控件.

WinActivate, ahk_id %VarContainingID%

ahk_pid 进程 ID

使用 ahk_pid 可以标识属于指定进程的窗口. 进程标识符(PID) 通常使用 WinGet, RunProcess 获取.

WinActivate, ahk_pid %VarContainingPID%

ahk_exe 进程名称/路径 [v1.1.01+]

使用 ahk_exe 可以标识含有指定名称或路径的进程拥有的窗口.

虽然 ahk_pid 仅限于某个指定进程, 但 ahk_exe 会考虑所有在进程名称或路径中含有指定字符串的进程. 如果启用了正则表达式的标题匹配模式, 则 ahk_exe 可以用正则表达式匹配进程, 但必须是进程的完整路径. 其他情况下, ahk_exe 接受不区分大小写的名称或完整路径, 例如 ahk_exe notepad.exe 可以匹配到 ahk_exe C:\Windows\Notepad.exe, ahk_exe C:\Windows\System32\Notepad.exe 及其他变化.

; 激活现有的 notepad.exe 窗口或打开新窗口
if WinExist("ahk_exe notepad.exe")
    WinActivate, ahk_exe notepad.exe
else
    Run, notepad.exe
SetTitleMatchMode RegEx
WinActivate ahk_exe i)\\notepad\.exe$  ; 匹配完整路径的名称部分.

ahk_group 窗口组

使用 ahk_group 可以标识匹配之前由窗口组定义的规则的窗口.

WinMinimize, WinMaximize, WinRestore, WinHide, WinShow, WinCloseWinKill 将对组中的所有窗口进行操作. 相比之下, 其他窗口命令(例如 WinActivateWinExist() / IfWinExist) 仅对组中最顶层的窗口进行操作.

; 定义组: Windows 资源管理器窗口
GroupAdd, Explorer, ahk_class ExploreWClass ; 在 Vista 及更高版本中不使用
GroupAdd, Explorer, ahk_class CabinetWClass

; 激活匹配上面条件的任意窗口
WinActivate, ahk_group Explorer

多重条件

ahk_group(它扩大了搜索范围) 比起来, 在 WinTitle 参数中指定多个条件可以缩小搜索范围. 在下面的例子中, 脚本等待标题中包含 My File.txt 类名为 Notepad 的窗口出现:

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

使用这种方法时, 应该首先列出标题的文本(如果希望使用), 后面跟着一个或多个附加条件. 超过一个条件时条件之间必须准确地用一个空格或 tab 分隔(其他任何空格或 tab 会被视为前面一个条件的文字部分).

ahk_id 可以和其他条件组合来测试窗口标题, 类名或其他属性.

MouseGetPos,,, id
if WinExist("ahk_class Notepad ahk_id " id)
    MsgBox The mouse is over Notepad.

"上次找到的" 窗口

这是由 IfWin[Not]Exist, WinExist(), IfWin[Not]Active, WinActive(), WinWait[Not]ActiveWinWait 最近找到的窗口. 这样可以让脚本更容易创建和维护, 因为目标窗口的 WinTitle 和 WinText 不需要在每个窗口命令中重复. 同时, 脚本会执行的更好, 因为在首次找到目标窗口后这些命令不需要再次搜索目标窗口.

"上次找到的" 窗口可以用于除 WinWait, WinActivateBottom, GroupAdd, WinGet CountWinGet List 以外的所有窗口命令. 要使用它, 只需简单地省略所有的四个窗口参数(WinTitle, WinText, ExcludeTitle 和 ExcludeText).

每个线程都会保持它自己的 "上次找到的" 窗口值, 这意味着如果当前线程被其他线程中断, 当原始线程恢复时它仍会拥有它原来的 "上次找到的" 窗口值, 而不是中断线程的值.

如果上次找到的窗口是隐藏的 Gui 窗口, 那么即使 DetectHiddenWindows 设置为 Off 时它也能用在窗口命令中. 这种特性常常和 Gui +LastFound 一起使用.

Run Notepad
WinWait Untitled - Notepad
WinActivate  ; 使用上次找到的窗口.

if WinExist("Untitled - Notepad")
; IfWinExist, Untitled(无标题) - Notepad(记事本)
{
    WinActivate  ; 自动使用上面找到的窗口.
    WinMaximize  ; 同上
    Send, Some text.{Enter}
    return
}

if not WinExist("Calculator")
    return
else
{
    WinActivate  ; 上面的 "IfWinNotExist" 也为我们设置了 "上次找到的" 窗口.
    WinMove, 40, 40  ; 把它移动到新位置.
    return
}