我们在进行窗口匹配的时候,根据匹配类型的不同可以多种匹配方法,根据使用者目录中可以找到九种匹配方式,这些匹配方式大都需自带的SPY监视工具用以查看窗口的名称.类名.进程名.句柄ID.位置信息等等
Window Spy的使用方法★★★
软件界面
这个软件是安装好之后自带的一个脚本,它本身也是用AUTOHOTKEY脚本写成的,包括界面也是用的GUI包
各控件功能
从上图中可以看到所有的小窗口功能分别是
1.窗口标题
计算器
ahk_class ApplicationFrameWindow
ahk_exe ApplicationFrameHost.exe
ahk_pid 11952
计算器
= 窗口名<标题/Title>
ahk_class ApplicationFrameWindow
= ahk_class <窗口类名>
ahk_exe ApplicationFrameHost.exe
= ahk_exe <执行文件名>
ahk_pid 11952
= ahk_pid <进程ID>
2.鼠标位置信息
Screen: 300, 379 (less often used)
Window: -1283, -160 (default)
Client: -1291, -160 (recommended)
Color: F0F0F0 (Red=F0 Green=F0 Blue=F0)
Screen
鼠标以屏幕左上角为原点的坐标X和Y值(较少使用)
Window
鼠标以当前窗口左上角为原点的坐标X和Y值(默认)
Client
鼠标以当前窗口的工作区左上角为原点的坐标X和Y值(推荐)此值一般最小
Color
鼠标当前位置的屏幕RGB色值
3.焦点控制
ClassNN: Windows.UI.Core.CoreWindow1
Text: 计算器
x: 8 y: 1 w: 321 h: 532
Client: x: 0 y: 1 w: 321 h: 532
SPY软件当前能检测到的控件类名ClassNN为Windows.UI.Core.CoreWindow1
4.当前活动窗口位置
x: 1583 y: 539 w: 337 h: 541 Client: x: 0 y: 0 w: 321 h: 533
x: 1583 y: 539 为窗口的左上角距离SCREEN原点的坐标
w: 337 h: 541为窗口的宽和高
5.状态栏文本
如果这个窗口中有名为Status Bar类的控件,则收录其中的文本
6.隐藏的文本(略)
7.所有文本(略)
程序窗口的9种匹配方法★★★★★
匹配方法 | 说明 |
---|---|
标题 | 匹配窗口标题 |
A | 匹配活动窗口 |
ahk_class | 窗口类 |
ahk_id | 唯一 ID/HWND |
ahk_pid | 进程 ID |
ahk_exe | 进程名称、路径 |
ahk_group | 窗口组 |
- | 多重条件 |
(都为空) | 匹配上次找到的窗口 |
匹配标题
SetTitleMatchMode, 1
WinActivate, 计算器
- 匹配标题是根据
SetTitleMatchMode
的模式来进行,分别有五种不同匹配模式SetTitleMatchMode, 1
(默认模式)窗口标题必须以<关键词>为开头,比如窗口的全称为"计算器",激活该窗口使用<WinActivate, 计算
>即可,只要前面的任意长度匹配即可SetTitleMatchMode, 2
标题任意位置包含<关键词> 比如说还是刚才这个计算器, 那么<WinActivate, 算
>或者<WinActivate, 器
>都是可以匹配上的,当然前提是要保证这个关键词是所有窗口中唯一的SetTitleMatchMode, 3
标题必须全部字符匹配上<关键词>错一个或多一个或少一个都不行,必须一字不差的匹配上,该模式下必须用<WinActivate, 计算器
>才行SetTitleMatchMode RegEx
正则表达式匹配, 该模式下刚才的匹配写成<WinActivate, .*?算.*
>SetTitleMatchMode, Fast
(默认模式) 性能比起 Slow 有较大提升, 但某些类型窗口中的一些 WinText 可能无法被各种窗口命令检测到.SetTitleMatchMode, Slow
速度慢得多, 但窗口命令会获取窗口中所有可能的文本以寻找 WinText 匹配. Window Spy中会显示哪些部分的窗口文本(如果有)需要慢速模式才能匹配到。
匹配活动窗口
当前的活动窗口直接使用字母A代替
;最大化当前的活动窗口
WinMaximize, A
ahk_class 窗口类
匹配上刚才的计算器可以使用SPY当中获取到的窗口类,在匹配的时候,必须带上ahk_class
来修饰后面的窗口类,在SPY当中直接整行复制即可
;让计算器窗口处理活动状态
WinActivate, ahk_class ApplicationFrameWindow
ahk_id 唯一 ID / HWND
匹配窗口的唯一ID号也就是句柄,用在特定的地方,比方说有同一个程序同时启动了10个同名窗口,而我需要匹配其中位置在Y轴上位置低于400像素的窗口进行最大化,可以用到这个方法先判断窗口的位置信息再获取窗口句柄的方法来定位
WinGet, id , List, 计算器
Loop , %id%{
this_id := id%A_Index%
WinGetPos,, winY, , cineHeight, ahk_id %this_id%
if winY> 400
{
WinMaximize, ahk_id %this_id%
}
}
这样子就把所有窗口底于400像素高度的"计算器"窗口全部进行了最大化,因为WinGet
获取的list列表就是一个句柄数组,所以在匹配的时候直接使用ahk_id %this_id%
,这里的百分号是用来取值
操作的,相当于一般语言中的变量值, 而%A_Index%
是一个Loop
循环中的内置变量,用来储存当前的循环序号, 而数组取下标值不需要一般语言中的[]
符号,直接在变量名后面带上下标id1 id2
等即可,所以this_id := id%A_Index%
ahk_pid 进程 ID
使用 ahk_pid 可以标识属于指定进程的窗口。进程标识符(PID)通常使用 WinGet、Run 或 Process 获取。这种方法一般要配合鼠标获取当前位置下的程序ID使用,如下例子(多重条件)
ahk_id 可以和其他条件组合来测试窗口标题、类名或其他属性,以下例子可以同时匹配鼠标所在位置的窗口ID
^F10::
MouseGetPos,,, id
if WinExist("ahk_exe ApplicationFrameHost.exe ahk_id " id)
MsgBox 当前鼠标所指程序的ID在程序<计算器>上
Return
多重匹配方法详情参考下面的多重匹配
ahk_exe 进程名称、路径
使用 ahk_exe 可以标识含有指定名称
或路径
的进程拥有的窗口。这个EXE名称可以从SPY当中获取,如果磁盘路径中的文件名和SPY当中获取的名称不一致,以SPY为准
;使计算器最大化
WinMaximize, ahk_exe ApplicationFrameHost.exe
ahk_group 窗口组
使用 ahk_group 可以标识匹配之前由窗口组定义的规则的窗口。
函数名 | 功能 |
---|---|
WinMinimize | 最小化 |
WinMaximize | 最大化 |
WinRestore | 恢复之前 |
WinHide | 隐藏 |
WinShow | 显示 |
WinClose | 关闭 |
WinKill | 强制关闭 |
以上每个都将对ahk_group组中的所有窗口进行操作。相比之下,其他窗口命令(例如 WinActivate 和 IfWinExist)仅对组中最顶层的窗口进行操作。
;将计算器程序和笔记本TXT工具加入窗口组,然后将组内所有窗口一起最大化
^F10::
GroupAdd, myGroup, ahk_exe ApplicationFrameHost.exe
GroupAdd, myGroup, ahk_exe notepad.exe
WinMaximize, ahk_group myGroup
Return
这个功能会将所有找到的匹配窗口全部加入到窗口组的数组对象当中,包括多个同名程序
多重条件
与 ahk_group (它活动了搜索范围)比起来,在 WinTitle 参数中指定多个条件可以缩小搜索范围。
- 在下面的例子中, 脚本等待标题中包含 123456.txt 且 类名为 Notepad 的窗口出现然后最大化
^F10::
WinWait 123456 ahk_class Notepad
WinMaximize
Return
使用这种方法时,应该首先列出标题的文本(如果希望使用),后面跟着一个或多个附加条件。超过一个条件时条件之间必须准确地用一个空格或 tab 分隔 (其他任何空格或 tab 会被视为前面一个条件的文字部分).
- 另一个例子请参考上面的
ahk_pid 进程 ID
, 在多重匹配的时候,ahk_pid写在最后面,并托上引号,再接真实的ID句柄
“上次找到的” 窗口
这是由以下函数最近找到的窗口,在当前程序的使用中,所有需要传参窗口的函数,都可以留空,也就是不传参,就相当于直接使用上次找到的窗口,比如先判定某窗口是否存在,然后再最大化
^F10::
if WinExist("ahk_exe ApplicationFrameHost.exe")
WinMaximize
Return
可以看到在最大化窗口的时候,直接留空就直接最大化了上一行中找到的窗口
函数名 | 功能 |
---|---|
IfWin[Not]Exist | 存在某窗口 |
WinExist() | 存在某窗口(有返回值) |
IfWin[Not]Active | 是否活动窗口 |
WinActive() | 是否活动窗口(有反回值) |
WinWait[Not]Active | 等待窗口成为活动窗口 |
WinWait | 等待窗口启动 |
这样可以让脚本更容易创建和维护, 因为目标窗口的 WinTitle 和 WinText 不需要在每个窗口命令中重复. 同时, 脚本会执行的更好, 因为在首次找到目标窗口后这些命令不需要再次搜索目标窗口.
“上次找到的” 窗口可以用于除 WinWait, WinActivateBottom 和 GroupAdd 以外的所有窗口命令. 要使用它, 只需简单地省略所有的四个窗口参数 (WinTitle, WinText, ExcludeTitle 和 ExcludeText).