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, MouseGetPosDllCall().

WinTitle, WinText, ExcludeTitle, ExcludeText

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

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

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

子命令

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

List

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

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

ListView

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

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

选项 描述
Selected 仅获取选择(高亮) 行而不是所有行. 如果没有, OutputVar 被置空.
Focused 仅获取焦点行. 如果没有, OutputVar 被置空.
ColN 仅获取第 N 列(字段) 而不是所有列. 把 N 替换为您选择的数字. 例如, Col4 获取第四列.
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

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

除最后一个项目以外的每个项目都以换行符(`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, SendMessageDllCall(). 相关提示, 还可以通过 MouseGetPos 来获取控件的 HWND. 最后, 控件的 HWND 可以直接用在 ahk_id WinTitle 中(即使 DetectHiddenWindows 设置关闭时, 这样对于隐藏控件也是有效的).

错误处理

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

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

备注

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

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

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.