许多命令和一些函数中含有 WinTitle 参数用来标识要操作的窗口. 此参数可以为窗口的标题或部分标题及在此页面描述的其他条件.
快速参考标题 | 匹配行为 |
A | 活动窗口 |
ahk_class | 窗口类 |
ahk_id | 唯一 ID/HWND |
ahk_pid | 进程 ID |
ahk_exe | 进程名称/路径 |
ahk_group | 窗口组 |
多重条件 | |
(都为空) | 上次找到的窗口 |
SetTitleMatchMode 控制参数中的部分标题或完整标题与每个窗口标题的比较方式. 根据这个设置, WinTitle 可以为准确的标题或包含前面部分或标题任意位置的子字符串或正则模式. 这个设置还控制 ahk_class 和 ahk_exe 是否解释为正则模式.
窗口标题是区分大小写的, 除非在 RegEx 模式中使用 i) 修饰符.
只有在 DetectHiddenWindows 设置打开时才会检测到隐藏窗口, 不过 WinShow 总是能检测到隐藏窗口.
如果多个窗口匹配 WinTitle 及其他条件, 则使用最顶层的匹配窗口. 如果活动窗口匹配条件, 则它通常优先, 因为它一般在其他所有窗口的上面. 然而, 如果某个置顶窗口也匹配条件(且活动窗口没有置顶), 则使用这个置顶窗口.
如果 WinTitle 为字母 A
且其他三个窗口参数(WinText, ExcludeTitle 和 ExcludeText) 都为空或省略, 则使用活动窗口.
; 获取活动窗口的 ID/HWND id := WinExist("A") MsgBox % id ; 按下 Win+↑ 来最大化活动窗口 #Up::WinMaximize, A
窗口类是系统用来创建窗口的模板的属性集. 换句话说, 窗口类表示窗口的类型. 要使用窗口类, 请根据 Window Spy 显示的指定 ahk_class ExactClassName
. 可以用 WinGetClass 获取 ExactClassName.
如果启用了正则的标题匹配模式, 则 ahk_class 接受正则表达式.
; 激活命令行窗口 (例如 cmd.exe) WinActivate, ahk_class ConsoleWindowClass
每个窗口或控件都含有唯一 ID, 也称为 HWND(即窗口句柄的缩写). 即使在窗口或控件的标题改变时也可用这个 ID 来识别它. 窗口的 ID 通常使用 WinExist() 或 WinGet 获取. 控件的 ID 通常使用 ControlGet Hwnd, MouseGetPos 或 DllCall() 获取. 此外, ahk_id 甚至可以操作于隐藏控件, DetectHiddenWindows 的设置不影响控件.
WinActivate, ahk_id %VarContainingID%
使用 ahk_pid 可以标识属于指定进程的窗口. 进程标识符(PID) 通常使用 WinGet, Run 或 Process 获取.
WinActivate, ahk_pid %VarContainingPID%
使用 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 可以标识匹配之前由窗口组定义的规则的窗口.
WinMinimize, WinMaximize, WinRestore, WinHide, WinShow, WinClose 和 WinKill 将对组中的所有窗口进行操作. 相比之下, 其他窗口命令(例如 WinActivate 和 WinExist() / 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]Active 或 WinWait 最近找到的窗口. 这样可以让脚本更容易创建和维护, 因为目标窗口的 WinTitle 和 WinText 不需要在每个窗口命令中重复. 同时, 脚本会执行的更好, 因为在首次找到目标窗口后这些命令不需要再次搜索目标窗口.
"上次找到的" 窗口可以用于除 WinWait, WinActivateBottom, GroupAdd, WinGet Count 和 WinGet 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 }