WinGet

获取指定窗口的唯一 ID, 进程 ID(PID), 进程名或控件列表. 它还可以获取匹配指定条件的所有窗口的列表.

WinGet, OutputVar , SubCommand, WinTitle, WinText, ExcludeTitle, ExcludeText

参数

OutputVar
用来保存 SubCommand 结果的变量名.
SubCommand
要执行的操作, 如果为空默认为 ID 子命令. 请参阅子命令.
WinTitle
窗口标题或识别目标窗口的其他条件. 请参阅 WinTitle.
WinText
如果使用此参数, 那么它必须是目标窗口中单个文本元素的子字符串(和内置的 Window Spy 工具显示的一样). 当 DetectHiddenText 的设置为 ON 时, 那么会检测到隐藏文本元素.
ExcludeTitle
标题中含有此参数值的窗口将被排除.
ExcludeText
文本中含有此参数值的窗口将被排除.

子命令

对于 SubCommand, 指定以下命令之一:

ID

获取窗口的唯一 ID 号.

WinGet, OutputVar, ID , WinTitle, WinText, ExcludeTitle, ExcludeText

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

IDLast

如果找到多个匹配窗口, 它会获取最后的/最下面的窗口唯一 ID.

WinGet, OutputVar, IDLast , WinTitle, WinText, ExcludeTitle, ExcludeText

也称为窗口句柄(HWND). 如果没有匹配的窗口, 则 OutputVar 被置空. 如果只有一个匹配, 那么它的效果与 ID 子命令相同. 这种特性类似于 WinActivateBottom.

PID

获取窗口的进程 ID.

WinGet, OutputVar, PID , WinTitle, WinText, ExcludeTitle, ExcludeText

如果没有匹配的窗口, 则 OutputVar 被置空.

ProcessName

获取拥有窗口的进程名.

WinGet, OutputVar, ProcessName , WinTitle, WinText, ExcludeTitle, ExcludeText

例如, 可能是 "notepad.exe". 如果没有匹配窗口, 那么 OutputVar 被置空.

ProcessPath [v1.1.01+]

获取拥有窗口的进程的完整路径和名称.

WinGet, OutputVar, ProcessPath , WinTitle, WinText, ExcludeTitle, ExcludeText

例如, 可能是 "C:\Windows\System32\notepad.exe". 如果没有匹配窗口, 那么 OutputVar 被置空.

Count

获取与标题/文本参数匹配的现有窗口的数量.

WinGet, OutputVar, Count , WinTitle, WinText, ExcludeTitle, ExcludeText

如果没有匹配窗口, OutputVar 设为 0. 要统计整个系统的所有窗口数, 请省略所有的四个标题/文本参数. 只有在打开 DetectHiddenWindows 设置时才会包括隐藏窗口.

List

与标题/文本参数相匹配的所有现有窗口的唯一 ID 号.

WinGet, OutputVar, List , WinTitle, WinText, ExcludeTitle, ExcludeText

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

MinMax

获取窗口的最小化/最大化状态.

WinGet, OutputVar, MinMax , WinTitle, WinText, ExcludeTitle, ExcludeText

如果不存在匹配窗口, 则 OutputVar 被置空; 否则, 它被设置为下列数字的其中一个:

ControlList

获取窗口中每个控件的控件名.

WinGet, OutputVar, ControlList , WinTitle, WinText, ExcludeTitle, ExcludeText

如果没有匹配窗口或窗口中没有控件, 那么 OutputVar 被置空. 否则, 每个控件的名称都包含其类名, 紧接着序号(ClassNN), 如同 Window Spy 显示的那样.

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

控件是按照 Z 轴顺序排序的, 如果窗口支持选项卡, Z 轴顺序通常与使用 Tab 键的导航顺序相同.

ControlListHwnd [v1.0.43.06+]

获取窗口中每个控件的唯一 ID 号.

WinGet, OutputVar, ControlListHwnd , WinTitle, WinText, ExcludeTitle, ExcludeText

如果没有匹配窗口或窗口中没有控件, 那么 OutputVar 被置空. 否则, 每个唯一 ID 都是控件的窗口句柄(HWND). 除最后一项之外的每一项以换行符(`n) 结束.

控件是按照 Z 轴顺序排序的, 如果窗口支持选项卡, Z 轴顺序通常与使用 Tab 键的导航顺序相同.

Transparent

获取窗口的透明度的等级.

WinGet, OutputVar, Transparent , WinTitle, WinText, ExcludeTitle, ExcludeText

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

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

TransColor

获取在窗口中标记为透明的颜色.

WinGet, OutputVar, TransColor , WinTitle, WinText, ExcludeTitle, ExcludeText

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

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

Style

获取表示窗口样式的 8 位十六进制数字.

WinGet, OutputVar, Style , WinTitle, WinText, ExcludeTitle, ExcludeText

如果没有匹配窗口, 那么 OutputVar 被置空. 下面的例子判断窗口是否含有 WS_DISABLED 样式:

WinGet, Style, Style, My Window Title
if (Style & 0x8000000)  ; 0x8000000 is WS_DISABLED.
  MsgBox The window is disabled.

请参阅样式表了解用于样式的部分列表.

ExStyle

获取表示窗口扩展样式的 8 位十六进制数字.

WinGet, OutputVar, ExStyle , WinTitle, WinText, ExcludeTitle, ExcludeText

如果没有匹配窗口, 那么 OutputVar 被置空. 下面的例子判断窗口是否含有 WS_EX_TOPMOST 样式(置顶):

WinGet, ExStyle, ExStyle, My Window Title
if (ExStyle & 0x8)  ; 0x8 is WS_EX_TOPMOST.
   MsgBox The window is always-on-top.

请参阅样式表了解用于样式的部分列表.

备注

窗口的 ID 号只在窗口的生存期内有效. 换句话说, 如果重启了应用程序, 其所有的窗口都会使用新的 ID 号.

由此命令获取的 ID 号是数字的(不包含前缀 "ahk_id"), 且不论 SetFormat 如何设置都保存为十六进制格式.

当前鼠标光标下的窗口 ID 可以通过 MouseGetPos 获取.

尽管 ID 号目前是 32 位无符号整数, 但在将来的版本中它们可能会变为 64 位. 因此, 对这些值执行诸如加法之类的数值运算是不可靠的, 因为这些运算需要把输入字符串解析为有符号而不是无符号的整数.

窗口标题和文本是区分大小写的. 只有在打开 DetectHiddenWindows 设置时, 才能检测到隐藏窗口.

相关

WinGetClass, Process, WinGetTitle, MouseGetPos, ControlGet, ControlFocus, GroupAdd

示例

#1: 最大化活动窗口并显示其唯一 ID:

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