# 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 号.
- IDLast: 如果找到多个匹配窗口, 它会获取最后的/最下面的窗口唯一 ID.
- PID: 获取窗口的进程 ID.
- ProcessName: 获取拥有窗口的进程名.
- ProcessPath [v1.1.01+]: 获取拥有窗口的进程的完整路径和名称.
- Count: 获取与标题/文本参数匹配的现有窗口的数量.
- List: 与标题/文本参数相匹配的所有现有窗口的唯一 ID 号.
- MinMax: 获取窗口的最小化/最大化状态.
- ControlList: 获取窗口中每个控件的控件名.
- ControlListHwnd [v1.0.43.06+]: 获取窗口中每个控件的唯一 ID 号.
- Transparent: 获取窗口的透明度的等级.
- TransColor: 获取在窗口中标记为透明的颜色.
- Style: 获取表示窗口样式的 8 位十六进制数字.
- ExStyle: 获取表示窗口扩展样式的 8 位十六进制数字.

### ID

获取窗口的唯一 ID 号.

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

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

### 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 被置空; 否则, 它被设置为下列数字的其中一个:

- -1: 窗口处于最小化状态(使用 WinRestore 可以让它还原).
- 1: 窗口处于最大化状态(使用 WinRestore 可以让它还原).
- 0: 窗口既不处于最小化状态也不处于最大化状态.

### 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

## 示例

最大化活动窗口并报告其唯一 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

dftg