WinGet

AutoHotkey

WinGet

获取指定窗口的唯一 ID、进程 ID、进程名或控件列表。它还可以获取匹配指定条件的所有窗口的列表。

WinGet, OutputVar [, Cmd, WinTitle, WinText, ExcludeTitle, ExcludeText]

参数

OutputVar

用来保存 Cmd 结果的变量名.

Cmd
请参阅后面的列表.
WinTitle

窗口标题或识别目标窗口的其他条件。请参阅 WinTitle

WinText

如果使用此参数, 那么它必须是目标窗口中单个文本元素的子字符串 (和内置的 Window Spy 工具显示的一样). 当 DetectHiddenText 的设置为 ON 时, 那么会检测到隐藏文本元素.

ExcludeTitle

标题中含有此参数值的窗口将被排除.

ExcludeText

文本中含有此参数值的窗口将被排除.

Cmd 为要执行的操作, 留空时默认为 ID. 它可以为下列单词的其中一个:

ID: 获取窗口的唯一 ID 号 (HWND/句柄). 如果没有匹配窗口, 那么 OutputVar 被置空. 使用 WinExist()WinActive() 也可以获取窗口的 ID;例如,WinExist("A") 能快速获取活动窗口 ID。要找出控件的 HWND(用于 Post/SendMessageDllCall),请使用 ControlGet HwndMouseGetPos

IDLast: 与上面相同, 不过如果找到多个匹配窗口, 它会获取最后的/最下面的窗口 ID. 如果只有一个匹配, 那么它的效果与 ID 相同. 这种特性类似于 WinActivateBottom.

PID: 获取窗口的 进程 ID (PID).

ProcessName: 获取拥有窗口的进程名 (例如 notepad.exe). 如果没有匹配窗口, 那么 OutputVar 被置空.

ProcessPath [v1.1.01+]: 类似于 ProcessName, 但获取进程的完整路径和名称而不仅是名称.

Count: 获取匹配指定 WinTitle, WinText, ExcludeTitle 以及 ExcludeText 的窗口数 (没有则为 0). 要统计系统中所有窗口数, 请省略所有的四个标题/文本参数. 只有在打开 DetectHiddenWindows 设置时才会包括隐藏窗口.

List: 获取匹配指定的 WinTitle, WinText, ExcludeTitle 以及 ExcludeText 的所有窗口的唯一 ID 号 (要获取整个系统中所有窗口, 请省略所有的四个标题/文本参数). 每个 ID 号保存在名称以 OutputVar 开始的变量(构成伪数组)中,而 OutputVar 自己则保存了获取的项数(没有则为 0)。例如, 如果 OutputVar 为 MyArray 且找到两个匹配的窗口, 那么 MyArray1 会被设置为首个窗口的 ID, MyArray2 被设置为第二个窗口的 ID, 同时 MyArray 自身被设置为数目 2. 窗口获取的顺序是从最上面到最下面 (根据它们在桌面上的堆放顺序). 只有在打开 DetectHiddenWindows 设置时才会包括隐藏窗口. 在函数中,要创建全局而不是局部的伪数组,必须在使用此命令前声明 MyArray 为全局变量(对于假设全局函数,反之亦成)。

MinMax: 获取窗口的最小化/最大化状态. 如果不存在匹配窗口, 则 OuputVar 被置空; 否则, 它被设置为下列数字的其中一个:
-1: 窗口处于最小化状态 (使用 WinRestore 可以让它还原).
1: 窗口处于最大化状态 (使用 WinRestore 可以让它还原).
0: 窗口既不处于最小化状态也不处于最大化状态.

ControlList: 获取窗口中所有控件的控件名称. 如果没有匹配窗口或窗口中没有控件, 那么 OutputVar 被置空. 否则, 每个控件的名称由其类名紧接着序号 (ClassNN) 组成, 如同 Window Spy 显示的那样.

除最后一项外的其他项以换行符结束 (`n). 要逐个检查每个控件的名称, 请使用 解析循环, 如同下文示例部分演示的那样.

控件根据它们的 Z 顺序排列, 当窗口支持 TAB 导航时这通常和 TAB 键导航的顺序相同.

当前鼠标光标下的控件可以通过 MouseGetPos 获取.

ControlListHwnd [v1.0.43.06+]: 与上面相同, 不过它获取每个控件的 窗口句柄 (HWND) 而不是其 ClassNN.

Transparent: 获取度数表示的窗口的透明度 (请参阅 WinSet 了解如何设置透明度). 出现后面这些情况时 OutputVar 被置空: 1) 操作系统低于 Windows XP; 2) 没有匹配窗口; 3) 窗口没有设置透明度等级; 或 4) 其他情况 (由操作系统行为引起), 例如设置透明后窗口被最小化, 还原和/或重设大小. 否则, 被设置为介于 0 和 255 之间的数字, 这里 0 表示完全透明的窗口而 255 表示不透明的窗口. 例如:

MouseGetPos,,, MouseWin
WinGet, Transparent, Transparent, ahk_id %MouseWin%  ; 鼠标光标下的窗口透明度.

TransColor: 获取窗口的透明色 (请参阅 WinSet 了解如何设置透明色). 出现后面这些情况时 OutputVar 被置空: 1) 操作系统低于 Windows XP; 2) 没有匹配窗口; 3) 窗口没有透明色; 或 4) 其他情况 (由操作系统行为引起), 例如设置透明后窗口被最小化, 还原和/或重设大小. 否则, 被设置为六位的十六进制 RGB 颜色值, 例如 0x00CC99. 例如:

MouseGetPos,,, MouseWin
WinGet, TransColor, TransColor, ahk_id %MouseWin%  ; 鼠标光标下的窗口透明色.

StyleExStyle: 分别获取表示窗口样式或扩展样式的 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

示例

; Example #1: 最大化活动窗口并显示其唯一 ID:
WinGet, active_id, ID, A
WinMaximize, ahk_id %active_id%
MsgBox, The active window's ID is "%active_id%".

; Example #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
}

; Example #3: 从 ControlList 中提取每个控件的名称:
WinGet, ActiveControlList, ControlList, A
Loop, Parse, ActiveControlList, `n
{
    MsgBox, 4,, Control #%a_index% is "%A_LoopField%". Continue?
    IfMsgBox, No
        break
}

; Example #4: 实时显示活动窗口的控件列表:
#Persistent
SetTimer, WatchActiveWindow, 200
return
WatchActiveWindow:
WinGet, ControlList, ControlList, A
ToolTip, %ControlList%
return