WinGet

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

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

参数

OutputVar
用来保存 SubCommand 结果的输出变量的名称.
SubCommand
如果为空或省略, 默认为 ID(获取窗口的唯一 ID). 否则, 请指定要执行的子命令.
WinTitle, WinText, ExcludeTitle, ExcludeText

如果这些都是空白或省略, 将使用上次找到的窗口. 否则, 为 WinTitle 指定窗口标题或其他条件, 来标识目标窗口, 和/或为 WinText 指定目标窗口的单个文本元素的子字符串(由包含的 Window Spy 实用程序显示).

ExcludeTitleExcludeText 可用于根据标题或文本排除一个或多个窗口. 它们的规范类似于 WinTitleWinText, 除了 ExcludeTitle 不识别除窗口标题之外的任何条件.

窗口标题和文本是区分大小写的. 默认情况下, 不检测隐藏窗口, 而检测隐藏文本元素, 除非使用 DetectHiddenWindowsDetectHiddenText 进行更改. 默认情况下, 窗口标题必须以指定的 WinTitleExcludeTitle 开头才能匹配, 除非使用 SetTitleMatchMode 进行更改.

子命令

对于 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 自己则保存了获取的 ID 数量(没有则为 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 的列表. 每个 ID 是控件的窗口句柄(HWND).

除最后一项之外的每一个 ID 都以换行符(`n) 结束. 要逐项检查单个 ID, 请使用如下面示例 #3 所示的解析循环.

控件是按照 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 为 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 为 WS_EX_TOPMOST.
   MsgBox The window is always-on-top.

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

备注

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

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

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

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

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

示例

最大化活动窗口并报告其唯一 ID.

WinGet, active_id, ID, A
WinMaximize, ahk_id %active_id%
MsgBox, The active window's ID is "%active_id%".

访问整个系统上所有窗口并显示它们的信息.

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
}

从活动窗口的控件列表中提取每个控件的名称.

WinGet, ActiveControlList, ControlList, A
Loop, Parse, ActiveControlList, `n
{
    MsgBox, 4,, Control #%A_Index% is "%A_LoopField%". Continue?
    IfMsgBox, No
        break
}

实时显示活动窗口的控件列表.

#Persistent
SetTimer, WatchActiveWindow, 200
return

WatchActiveWindow:
WinGet, ControlList, ControlList, A
ToolTip, %ControlList%
return