返回符合指定条件的窗口的 uID,进程ID,进程名称,或控件列表。它也可以返回一个列表,包含所有符合指定条件的窗口。
WinGet, OutputVar [, Cmd, WinTitle, WinText, ExcludeTitle, ExcludeText]
OutputVar | 输出变量,存储由 Cmd 指定的结果。 |
Cmd | 查看下面的说明。 |
WinTitle | 目标窗口的标题或标题中的部分文字(匹配模式由 SetTitleMatchMode 决定)。如果省略下面 3 个参数,默认目标是 上一次匹配的窗口 。要用窗口的 class 名进行匹配,使用 ahk_class 精确 class 名(Window Spy 中可以显示 class 名)。要用窗口的 进程标识符(PID)进行匹配,使用 ahk_pid %PID变量% 。要用窗口的 唯一 ID 进行匹配,使用 ahk_id %ID变量% 。要减小检测范围,使用 多重条件 ,例如:My File.txt ahk_pid %ID变量% |
WinText | 如果使用这个参数,则它应该是目标窗口中某个文本元素的子字符串(在 Window Spy 中会显示出窗口中的文本元素)。隐藏文本只有在 DetectHiddenText 设置为 ON 的时候才能检测到。 |
ExcludeTitle | 标题中包含该参数指定的文字的窗口将被除外。 |
ExcludeText | 文本元素中包含该参数指定的文字的窗口将被除外。 |
Cmd 指定了返回值的内容,如果留空,默认是 ID 。它可以是下面单词的其中之一:
ID:返回窗口的 uID(HWND/句柄)。如果没有匹配窗口,OutputVar 为空。函数 WinExist() 和 WinActive() 也可以用来获取窗口的 uID ,例如,WinExist("A") 能快速获取当前激活窗口的 uID 。要获取一个控件的 HWND(供 Post/SendMessage 或 DllCall 使用),使用 ControlGet Hwnd 或 MouseGetPos 。
IDLast:和上面的功能一样,不过当匹配的窗口超过一个的时候,它返回的是 最底端/最后使用 的窗口的 ID。如果只有一个匹配窗口,它和 ID 的效果一样。类似的概念也适用于 WinActivateBottom 。
PID:返回窗口的 进程ID(PID)。
ProcessName:返回窗口所属进程的进程名称(例如 notepad.exe)。如果没有匹配窗口,OutputVar 为空。
Count:返回符合 WinTitle ,WinText ,ExcludeTitle 以及 ExcludeText 所指定的条件的窗口数量(如果没有匹配窗口则返回 0 )。要统计当前总窗口数,省略所有和 标题/文本 有关的参数。默认不统计隐藏窗口,除非打开了 DetectHiddenWindows 。
List:返回所有符合 WinTitle ,WinText ,ExcludeTitle 以及 ExcludeText 所指定的条件的窗口的 uID (要返回当前所有窗口的 uID ,省略所有和 标题/文本 有关的参数)。每个 ID 由一个 数组元素 存储,数组元素名从 OutputVar 开始,而 OutputVar 本身则存储了数组的长度(如果没有匹配窗口则为 0 )。例如,OutputVar 使用 MyArray ,有 2 个匹配窗口,则变量 MyArray1 存储了第一个窗口的 ID ,变量 MyArray2 存储了第二个窗口的 ID ,而变量 MyArray 存储了数组长度 2 。窗口 ID 的返回顺序是从最顶端的窗口到最底端的窗口(取决于它们在桌面上的堆放方式)。默认不返回隐藏窗口的 ID ,除非打开了 DetectHiddenWindows 。在一个 函数 中,要创建一个全局数组,在使用这个命令之前 声明 MyArray 为全局变量(在使用了 assume-global 的函数中则是相反的情况)。
MinMax:返回窗口的 最小化/最大化 状态。如果没有匹配窗口,OuputVar 为空,否则,返回下列数值之一:
-1:窗口处于最小化状态( WinRestore 可以还原它)。
1:窗口处于最大化状态( WinRestore 可以还原它)。
0:窗口既不处于最大化也不处于最小化状态。
ControlList:返回一个列表,包含窗口中所有控件的名称。如果没有匹配窗口或窗口中没有控件,OutputVar 为空。否则,每个控件的名称由它的 class 名和序号(ClassNN)组成,同 Window Spy 中显示的一样。
除了最后一个控件的名称之外,每个名称后都跟着一个换行符(`n)。要单独遍历所有的控件名称,使用 parsing loop ,可以参考最下面示例区中的例子。
控件名称的存储顺序取决于它们的 Z 轴顺序,如果窗口支持 Tab 导航,这个顺序一般和 Tab 顺序一样。
要返回鼠标当前所指控件的信息,使用 MouseGetPos 。
ControlListHwnd [v1.0.43.06+]:功能同上,不同的是它返回的是控件的 窗口句柄(HWND)。
Transparent:返回窗口的透明度(用 WinSet 设置窗口透明)。OutputVar 在以下情况时为空:1、系统比 Windows XP 老;2、没有匹配窗口;3、窗口没有设置透明;4、其它情况(由系统行为引起),例如窗口透明后被最小化,还原,以及/或者调整大小。否则,OutputVar 存储一个 0 到 255 之间的值,0 表示完全透明,255 表示不透明。例如:
MouseGetPos,,, MouseWin
WinGet, Transparent, Transparent, ahk_id %MouseWin% ; 获取鼠标当前所指窗口的透明度。
TransColor:返回窗口的透明色(用 WinSet 设置透明色)。OutputVar 在以下情况时为空:1、系统比 Windows XP 老;2、没有匹配窗口;3、窗口没有设置透明色;4、其它情况(由系统行为引起),例如窗口透明后被最小化,还原,以及/或者调整大小。否则,OutputVar 存储一个 6 位的十六进制数,表示 RGB 颜色,比如 0x00CC99 。例如:
MouseGetPos,,, MouseWin
WinGet, TransColor, TransColor, ahk_id %MouseWin% ; 获取鼠标当前所指窗口的透明色。
Style 或 ExStyle:返回一个 8 位的十六进制数,表示窗口的样式或扩展样式。如果没有匹配窗口,OutputVar 为空。下面这个例子检测一个窗口是否具有 WS_DISABLED 样式:
WinGet, Style, Style, My Window Title
if (Style & 0x8000000) ; 0x8000000 表示 WS_DISABLED 。
... 检测到窗口为不可用状态,进行适当的操作。
下面的例子检测一个窗口是否具有 WS_EX_TOPMOST 样式(置顶):
WinGet, ExStyle, ExStyle, My Window Title
if (ExStyle & 0x8) ; 0x8 表示 WS_EX_TOPMOST.
... 检测到窗口处于置顶状态,进行适当的操作。
更多样式,查看 样式列表 。
窗口的 ID 只在窗口的生命周期中有效。也就是说,一个程序重启之后,它所有的窗口都将使用新的 ID 。
这个命令获取的 ID 仅是一个数字(不包括前缀“ahk_id”),并且以十六进制存储,与 SetFormat 的设置无关。
要获取鼠标当前所指窗口的 ID ,使用 MouseGetPos 。
虽然目前获取的 ID 是 32 位的无符号整数,但是将来的版本中可能会变成 64 位的。因此,对这些值进行数学操作,例如相加,是不安全的。因为这些操作要求操作数是有正负号的整数而不是无符号的整数。
窗口的标题和窗口中的文字是大小写敏感的。要检测隐藏窗口,必须打开 DetectHiddenWindows 。
WinGetClass, Process, WinGetTitle, MouseGetPos, ControlGet, ControlFocus, GroupAdd
; 示例 #1:最大化当前激活窗口并且显示它的 uID 。 WinGet, active_id, ID, A WinMaximize, ahk_id %active_id% MsgBox, The active window's ID is "%active_id%". ; 示例 #2:访问当前所有窗口并且分别显示它们的信息。 WinGet, id, list,,, Program Manager Loop, %id% { this_id := id%A_Index% WinActivate, ahk_id %this_id% WinGetClass, this_class, ahk_id %this_id% WinGetTitle, this_title, ahk_id %this_id% MsgBox, 4, , Visiting All Windows`n%a_index% of %id%`nahk_id %this_id%`nahk_class %this_class%`n%this_title%`n`nContinue? IfMsgBox, NO, break } ; 示例 #3:从控件列表中分离出每个单独的控件名称。 WinGet, ActiveControlList, ControlList, A Loop, Parse, ActiveControlList, `n { MsgBox, 4,, Control #%a_index% is "%A_LoopField%". Continue? IfMsgBox, No break } ; 示例 #4:实时显示当前激活窗口的控件列表。 #Persistent SetTimer, WatchActiveWindow, 200 return WatchActiveWindow: WinGet, ControlList, ControlList, A ToolTip, %ControlList% return