ControlGet

优质
小牛编辑
126浏览
2023-12-01

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

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

参数

OutputVar

用来保存 Cmd 结果的变量名.

Cmd, Value
请参阅后面的列表.
控件

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

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

WinTitle

窗口标题或识别目标窗口的其他条件。请参阅 WinTitle

WinText

如果使用此参数, 那么它必须是目标窗口中单个文本元素的子字符串 (和内置的 Window Spy 工具显示的一样). 当 DetectHiddenText 的设置为 ON 时, 那么会检测到隐藏文本元素.

ExcludeTitle

标题中含有此参数值的窗口将被排除.

ExcludeText

文本中含有此参数值的窗口将被排除.

Cmd, Value

CmdValue 参数互相依赖, 它们的用法描述如下.

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

ListView:从列表视图中获取条目列表的方法是:

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

如果 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) ColNN option 指定的列不存在。

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

ControlGet, List, List, Selected, SysListView321, WinTitle
Loop, Parse, List, `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, 4126, 0, 80, SysListView321, WinTitle  ; 4126 为消息 LVM_SETCOLUMNWIDTH.
; 在上面的语句中, 0 表示首列 (1 表示第二列, 2 表示第三列, 等等.)  此外, 80 是新宽度.
; 把 80 替换为 -1 来自动调整列的大小. 替换为 -2 来实现相同的功能, 并且调整标题文本的宽度.

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

除最后一行外的其他行都以换行符 (`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 为 TCM_GETITEMCOUNT.
TabCount = %ErrorLevel%

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

Choice:设置OutputVar列表框或组合框中当前选择的条目名称。要获取所选条目的位置, 请参照此例 (只需使用下面开始两行中的其中一行):

SendMessage, 0x188, 0, 0, ListBox1, WinTitle  ; 0x188 为 LB_GETCURSEL (对于列表框).
SendMessage, 0x147, 0, 0, ComboBox1, WinTitle  ; 0x147 为 CB_GETCURSEL (对于下拉列表或组合框).
ChoicePos = %ErrorLevel%  ; 如果没有选中的条目, 那么它会为 -1.
ChoicePos += 1  ; 从基于 0 转换到基于 1, 这样首个条目被称为 1, 而不是 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, SendMessageDllCall. 相关提示, 还可以使用 MouseGetPos 获取控件的 HWND. 最后, 控件的 HWND 可以直接用在 ahk_id WinTitle 中 (即使 DetectHiddenWindows 设置关闭时, 这样对于隐藏控件也是有效的).

ErrorLevel

[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.