# ControlGet

获取控件的各种类型的信息.

    ControlGet, OutputVar, SubCommand , Value, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

## 参数

OutputVar
  用来保存 SubCommand 结果的变量名.
SubCommand, Value
  他们互相依赖, 其用法描述如下.
Control

  可以是 ClassNN(控件的类名和实例编号) 或控件的文本, 它们都可以通过 Window Spy 获取. 使用文本时, 匹配行为由 SetTitleMatchMode 决定. 如果此参数为空, 则使用目标窗口的顶层控件.

  要对控件的 HWND(窗口句柄) 进行操作, 请将 Control 参数留空同时在 WinTitle 参数中指定 `ahk_id %ControlHwnd%`(即使在 DetectHiddenWindows 设置关闭时, 这样也可以操作隐藏控件). 获取控件的 HWND 的一般方法是使用 ControlGet Hwnd, MouseGetPos 或 DllCall().

WinTitle
  窗口标题或识别目标窗口的其他条件. 请参阅 WinTitle.
WinText
  如果使用此参数, 那么它必须是目标窗口中单个文本元素的子字符串(和内置的 Window Spy 工具显示的一样). 当 DetectHiddenText 的设置为 ON 时, 那么会检测到隐藏文本元素.
ExcludeTitle
  标题中含有此参数值的窗口将被排除.
ExcludeText
  文本中含有此参数值的窗口将被排除.

## 子命令

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

- List: 从列表视图, 列表框, 组合框或下拉列表中获取条目列表.
- Checked: 如果选中复选框或单选按钮, 则检索(返回) 1, 如果不选中, 则检索 0.
- Enabled: 启用控件时检索 1, 禁用控件时检索 0.
- Visible: 如果控件可见检索 1, 如果隐藏检索 0.
- Tab: 检索 SysTabControl32 控件的标签页数目.
- FindString: 检索列表框或组合框中与字符串完全匹配的条目编号.
- Choice: 检索列表框或组合框中当前选择的条目的名称.
- LineCount: 获取编辑控件中的行数.
- CurrentLine: 检索插入符号所在的编辑控件中的行号.
- CurrentCol: 检索插入符号所在的编辑控件中的列号.
- Line: 检索编辑控件中指定行号的文本.
- Selected: 在编辑控件中检索所选文本.
- Style: 检索表示控件样式的 8 位十六进制数字.
- ExStyle: 检索表示控件扩展样式的 8 位十六进制数字.
- Hwnd [v1.1.04+]: 检索控件的窗口句柄(HWND).

### List

从列表视图, 列表框, 组合框或下拉列表中检索项目列表. 对于 ListView, 可以指定附加的选项.

    ControlGet, OutputVar, List , Options, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

#### ListView

如果 Options 为空或省略, 则获取控件中所有文本. 除最后一行外的其他行都以换行符(`n) 结尾. 在每行中, 除最后一个字段外的其他字段(列) 都以 tab 字符(`t) 结尾.

在 Options 指定零个或多个下列单词, 单词间使用空格或 tab 分隔:

选项 | 描述
--- | ---
Selected | 仅获取选择(高亮) 行而不是所有行. 如果没有, OutputVar 被置空.
Focused | 仅获取焦点行. 如果没有, OutputVar 被置空.
Col4 | 仅获取第四列(字段) 而不是所有列(把 4 替换为您选择的数字).
Count | 获取控件中总行数(单个数字表示).
Count Selected | 获取选择(高亮) 的行数.
Count Focused | 获取焦点行的行号(位置)(如果没有焦点行则为 0).
Count Col | 获取控件的列数(如果列的总是无法确定则为 -1).

注意: 某些应用程序秘密地保存它们列表视图中的文本, 这样阻止了这些文本被获取. 在这种情况下, ErrorLevel 通常被置为 0(表示成功) 但获取的所有字段都是空的. 还有注意的是列表视图的文本是不受 #MaxMem 限制的.

如果获取成功, 则 ErrorLevel 被置为 0. 如果失败, 则它被置为 1 且 OutputVar 被置空. 引起失败的原因有: 1) 目标窗口或控件不存在; 2) 目标控件不是 SysListView32 类型; 3) 无法打开拥有列表视图的进程, 可能由于缺少用户权限或被锁定了; 4) ColN 选项指定的列不存在.

要从列表视图中逐个提取每行和每个字段, 请使用解析循环, 例如:

    ControlGet, SelectedItems, List, Selected, SysListView321, WinTitle
    Loop, Parse, SelectedItems, `n  ; 行之间由换行符(`n) 分隔.
    {
        RowNumber := A_Index
        Loop, Parse, A_LoopField, %A_Tab%  ; 每行中的字段(列) 之间由 tab(A_Tab) 分隔.
            MsgBox Row #%RowNumber% Col #%A_Index% is %A_LoopField%.
    }

相关提示, 列表视图中的列可以使用 SendMessage 来调整大小, 如下所示:

    SendMessage, 0x101E, 0, 80, SysListView321, WinTitle ; 0x101E 为消息 LVM_SETCOLUMNWIDTH.

在上面的语句中, 0 表示首列(1 表示第二列, 2 表示第三列, 等等.) 此外, 80 是新宽度. 把 80 替换为 -1 来自动调整列的大小. 替换为 -2 来实现相同的功能, 并且调整标题文本的宽度.

#### ListBox, ComboBox, DropDownList

获取控件中所有的文本(即不支持上面的列表视图选项, 例如 Count 和 Selected).

除最后一个项目以外的每个项目都以换行符(`n) 结束. 要逐个访问每个项目, 请使用解析循环, 例如:

    ControlGet, Items, List,, ComboBox1, WinTitle
    Loop, Parse, Items, `n
        MsgBox Item number %A_Index% is %A_LoopField%.

### Checked

如果选中复选框或单选按钮则检索 1, 如果不选中则检索 0.

    ControlGet, OutputVar, Checked ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

### Enabled

如果 Control(控件) 是启用的则检索 1, 禁用控件时检索 0.

    ControlGet, OutputVar, Enabled ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

### Visible

如果 Control 是可见的则检索 1, 隐藏控件时检索 0.

    ControlGet, OutputVar, Visible ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

### Tab

检索 SysTabControl32 控件的标签页的序号.

    ControlGet, OutputVar, Tab ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

首个选项卡为 1, 第二个为 2, 等等. 若要获取 Tab 控件中含有的选项卡(页面) 数量, 请参照此例:

    SendMessage, 0x1304,,, SysTabControl321, WinTitle   ; 0x1304 为 TCM_GETITEMCOUNT.
    TabCount = %ErrorLevel%

### FindString

检索列表框或组合框中与 String 完全匹配的条目编号.

    ControlGet, OutputVar, FindString, String , Control, WinTitle, WinText, ExcludeTitle, ExcludeText

控件中首个条目为 1, 第二个为 2, 依此类推. 如果没有找到匹配, 则 OutputVar 被置空且 ErrorLevel 被设置为 1.

Choice

检索列表框或组合框中当前选择的条目的名称.

    ControlGet, OutputVar, Choice ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

要获取所选条目的位置, 请参照此例(只需使用下面开始两行中的其中一行):

    SendMessage, 0x0188, 0, 0, ListBox1, WinTitle  ; 0x0188 为 LB_GETCURSEL (对于列表框).
    SendMessage, 0x0147, 0, 0, ComboBox1, WinTitle  ; 0x0147 为 CB_GETCURSEL (对于下拉列表或组合框).
    ChoicePos := ErrorLevel<<32>>32   ; 如果没有选中的条目, UInt 转换为 Int 时须 -1.
    ChoicePos += 1  ; 从基于 0 转换到基于 1, 这样首个条目被称为 1, 而不是 0.

### LineCount

获取编辑控件中的行数.

    ControlGet, OutputVar, LineCount ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

所有的编辑控件至少含有一行, 即使控件是空的.

### CurrentLine

检索插入符号(插入点) 所在的编辑控件中的行号.

    ControlGet, OutputVar, CurrentLine ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

首行为 1. 如果控件中选择了文本, 则 OutputVar 被设置为选区开始处所在的行号.

### CurrentCol

检索插入符号(文本插入点) 所在的编辑控件中的列号.

    ControlGet, OutputVar, CurrentCol ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

首列为 1. 如果控件中选择了文本, 则 OutputVar 被设置为选区开始处所在的列号.

### Line

检索编辑控件中行 N 的文本.

    ControlGet, OutputVar, Line, N , Control, WinTitle, WinText, ExcludeTitle, ExcludeText

行 1 为首行. 根据控件的性质, OutputVar 可能以回车符(`r) 或换车和换行符(`r`n) 结束. 如果指定的行号没有内容或不存在, 则 ErrorLevel 被置为 1 且 OutputVar 被置空.

### Selected

检索在编辑控件中所选文本.

    ControlGet, OutputVar, Selected ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

如果没有选择的文本, 则 OutputVar 会被置空且 ErrorLevel 被设置为 0(即没有错误). 某些类型的控件, 例如 RichEdit20A, 在某些情况下可能无法获取到正确的文本(例如 Metapad).

### Style

检索表示控件样式的 8 位十六进制数字.

    ControlGet, OutputVar, Style ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

对于一些样式的列表, 请参阅样式表.

### ExStyle

检索表示控件扩展样式的 8 位十六进制数字.

    ControlGet, OutputVar, ExStyle ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

对于一些样式的列表, 请参阅样式表.

### Hwnd [v1.0.43.06+]

检索控件的窗口句柄(HWND).

    ControlGet, OutputVar, Hwnd ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

例如: `ControlGet, OutputVar, Hwnd,, Edit1, WinTitle`. 控件的 HWND 常用于 PostMessage, SendMessage 和 DllCall(). 相关提示, 还可以通过 MouseGetPos 来获取控件的 HWND. 最后, 控件的 HWND 可以直接用在 ahk_id WinTitle 中(即使 DetectHiddenWindows 设置关闭时, 这样对于隐藏控件也是有效的).

## 错误处理

[v1.1.04+]: 此命令失败时会抛出异常. 想了解更多信息, 请参阅运行时错误.

成功时, ErrorLevel 被置为 0. 如果遇到问题, 例如窗口或控件不存在, 则 ErrorLevel 被置为 1 且 OutputVar 被置空.

## 备注

和其他改变控件的命令不同, ControlGet 后没有自动的延时; 即, SetControlDelay 不会影响它.

要获取鼠标当前悬停的控件的 ClassNN 或 HWND, 请使用 MouseGetPos. 要获取窗口中所有控件列表, 请使用 WinGet ControlList.

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

## 相关

Control, GuiControlGet, ControlMove, ControlGetText, ControlSetText, ControlGetPos, ControlClick, ControlFocus, ControlSend, WinGet

## 示例

检索第一个编辑控件的第一行.

    ControlGet, OutputVar, Line, 1, Edit1, Some Window Title

检索第一个选项卡控件的当前活动选项卡.

    ControlGet, WhichTab, Tab, , SysTabControl321, Some Window Title
    if ErrorLevel
        MsgBox There was a problem.
    else
        MsgBox Tab #%WhichTab% is active.

dftg