# WinGet

返回符合指定条件的窗口的 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