# ControlGet

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

ControlGet, OutputVar, Cmd [, Value, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

#### 参数

OutputVar | 用于保存 Cmd 结果的变量名称.
Cmd, Value | 见下表.
Control | 可以是 ClassNN (控件的类名和实例号) 或控件的名称/文本, 他们都可以通过 Window Spy 来确定.当使用名称/文本时, 匹配模式由 SetTitleMatchMode 决定.如果此参数为空, 将使用目标窗口的顶层控件. 要对一个控件的 HWND (窗口句柄) 进行操作, 请将 Control 参数留空同时在 WinTitle 参数中指定 ahk_id %ControlHwnd% (即使 DetectHiddenWindows 为 OFF, 这样也适用于隐藏的控件) .获取控件的 HWND 的典型方法是使用 ControlGet Hwnd, MouseGetPos, 或 DllCall 命令.
WinTitle | 目标窗口的标题或标题中的部分文字 (匹配模式由 SetTitleMatchMode 决定).如果此参数和后面三个参数都忽略, 默认目标是 上一次匹配窗口.如果此参数是字母 A, 同时省略后面三个参数, 则以当前的活动窗口为目标.要用窗口的类名进行匹配, 请指定 ahk_class ExactClassName (Window Spy 中可以显示类名).要用窗口的 进程标识符 (PID) 进行匹配, 请指定 ahk_pid %PID变量%.要使用 窗口组 进行匹配, 请指定 ahk_group GroupName.要使用窗口的 唯一 ID 进行匹配, 请指定 ahk_id %VarContainingID%.要减小检测范围, 请指定 多重条件.例如: My File.txt ahk_class Notepad
WinText | 如果使用这个参数, 则它应该是目标窗口中某个文本元素的子字符串 (在 Window Spy 中会显示窗口中的文本元素).隐藏文本只有当 DetectHiddenText 设置为 ON 的时候才能检测到.
ExcludeTitle | 标题中包含该参数指定的文字的窗口将被排除.
ExcludeText | 文本元素中包含该参数指定的文字的窗口将被排除.

#### Cmd, Value

Cmd 和 Value 参数相互依赖, 其用法描述如下.

List: 从列表视图,列表框, 组合框或下拉列表中获取条目列表.

ListView: 列表视图最常见的例子是资源管理器的文件和文件夹列表 (桌面也是一个列表视图). 从列表视图获取条目列表的语法是:

    ControlGet, OutputVar, List, Options, SysListView321, WinTitle, WinText

如果 Options 参数为空或省略, 会获取控件中的所有文本. 除了最后一行外的每行将以一个换行符 (`n) 结束. 在每行内部, 除了最后一个外的每个字段 (列) 将以一个制表符 (`t) 结束.

指定 Options 为 0 或多个下列单词, 彼此间使用一个空格或制表符分隔:

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 option 指定了一个不存在的列.

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

    ControlGet, List, List, Selected, SysListView321, WinTitle
    Loop, Parse, List, `n  ; Rows are delimited by linefeeds (`n).
    {
        RowNumber := A_Index
        Loop, Parse, A_LoopField, %A_Tab%  ; Fields (columns) in each row are delimited by tabs (A_Tab).
            MsgBox Row #%RowNumber% Col #%A_Index% is %A_LoopField%.
    }

相关提示, 列表视图中的列可以通过 SendMessage 命令调整大小, 例如:

    SendMessage, 4126, 0, 80, SysListView321, WinTitle  ; 4126 is the message LVM_SETCOLUMNWIDTH.
    ; In the above, 0 indicates the first column (specify 1 for the second, 2 for the third, etc.)  Also, 80 is the new width.
    ; Replace 80 with -1 to autosize the column. Replace it with -2 to do the same but also take into account the header text width.

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

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

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

Checked: 如果复选框或单选框被选中则设置 OutputVar 为 1否则为 0.

Enabled: 如果 Control 是启用的则设置 OutputVar 为 1, 禁用的则为 0.

Visible: 如果 Control 是可见的则设置 OutputVar 为 1, 隐藏的则为 0.

Tab: 设置 OutputVar 为 SysTabControl32 控件的标签页编号. 首个标签页为 1, 第二个为 2, 依此类推. 想要找出标签控件中有多少标签(页), 请参照此例:

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

FindString, String: 设置 OutputVar 为列表框或组合框中精确匹配 String 的条目的编号. 控件中首个条目为 1, 第二个为 2, 依此类推. 如果没有找到匹配, OutputVar 被置空同时 ErrorLevel 被设置为 1.

Choice: 设置 OutputVar 为列表框或组合框中当前选择的条目的名称. 想要获取当前选择项的位置, 请参照此例 (仅使用开始两行的其中一行):

    SendMessage, 0x188, 0, 0, ListBox1, WinTitle  ; 0x188 is LB_GETCURSEL (for a ListBox).
    SendMessage, 0x147, 0, 0, ComboBox1, WinTitle  ; 0x147 is CB_GETCURSEL (for a DropDownList or ComboBox).
    ChoicePos = %ErrorLevel%  ; It will be -1 if there is no item selected.
    ChoicePos += 1  ; Convert from 0-based to 1-based, i.e. so that the first item is known as 1, not 0.

LineCount: 设置 OutputVar 为编辑控件中的行数. 所有的编辑控件至少含有一行, 即使控件是空的.

CurrentLine: 设置 OutputVar 为编辑控件中光标处(插入位置)所在的行号. 首行为 1. 如果控件中选择了文本, OutputVar 被设置为选区开始处所在的行号.

CurrentCol: 设置 OutputVar 为编辑控件中光标处(文本插入点)所在的列号. 首列为 1. 如果控件中选择了文本, OutputVar 被设置为选区开始处所在的列号.

Line, N: 设置 OutputVar 为编辑控件中行 N 的文本. 行 1 为首行. 根据控件的性质, OutputVar 可能以一个回车符 (`r) 或一个回车和换行符 (`r`n) 结束. 如果指定的行号其内容是空的或不存在, ErrorLevel 被设置为 1 同时 OutputVar 被置空.

Selected: 设置 OutputVar 为编辑控件中选择的文本. 如果没有选择的文本, OutputVar 将被置空同时 ErrorLevel 被设置为 0 (即没有错误). 某些类型的控件, 如 RichEdit20A, 在某些情况下可能不能从那里得到正确的文本 (例如 Metapad).

Style: 获取一个表示控件样式的 8 位十六进制数. 想了解某些样式请参看 样式表.

ExStyle: 获取一个表示控件扩展样式的 8 位十六进制数.

Hwnd [v1.0.43.06+]: 获取指定控件的句柄 (HWND). 例如: ControlGet, OutputVar, Hwnd,, Edit1, WinTitle. 控件的 HWND 通常使用于 PostMessage, SendMessage, 和 DllCall 命令中. 相关提示, 控件的 HWND 也可以使用 MouseGetPos 命令获取. 最后, 控件的 HWND 可以作为 ahk_id WinTitle 直接使用(即使 DetectHiddenWindows 为 OFF, 这样也适用于隐藏控件).

#### ErrorLevel

如果获取成功, ErrorLevel 被设置为 0.如果出现错误 -- 例如不存在的窗口或控件 -- ErrorLevel 被设置为 1 同时 OutputVar 被置空.

#### 备注

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

要获取当前鼠标所指向控件的名称, 请使用 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.