获取控件的各种类型的信息.
ControlGet, OutputVar, SubCommand , Value, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
可以是 ClassNN(控件的类名和实例编号) 或控件的文本, 它们都可以通过 Window Spy 获取. 使用文本时, 匹配行为由 SetTitleMatchMode 决定. 如果此参数为空, 则使用目标窗口的顶层控件.
要对控件的 HWND(窗口句柄) 进行操作, 请将 Control 参数留空同时在 WinTitle 参数中指定 ahk_id %ControlHwnd%
(即使在 DetectHiddenWindows 设置关闭时, 这样也可以操作隐藏控件). 获取控件的 HWND 的一般方法是使用 ControlGet Hwnd, MouseGetPos 或 DllCall().
对于 SubCommand, 指定以下命令之一:
从列表视图, 列表框, 组合框或下拉列表中检索项目列表. 对于 ListView, 可以指定附加的选项.
ControlGet, OutputVar, List , Options, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
如果 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, 4126, 0, 80, SysListView321, WinTitle ; 4126 为消息 LVM_SETCOLUMNWIDTH.
在上面的语句中, 0 表示首列(1 表示第二列, 2 表示第三列, 等等.) 此外, 80 是新宽度. 把 80 替换为 -1 来自动调整列的大小. 替换为 -2 来实现相同的功能, 并且调整标题文本的宽度.
获取控件中所有的文本(即不支持上面的列表视图选项, 例如 Count 和 Selected).
除最后一个项目以外的每个项目都以换行符(`n) 结束. 要逐个访问每个项目, 请使用解析循环, 例如:
ControlGet, Items, List,, ComboBox1, WinTitle Loop, Parse, Items, `n MsgBox Item number %A_Index% is %A_LoopField%.
如果选中复选框或单选按钮则检索 1, 如果不选中则检索 0.
ControlGet, OutputVar, Checked ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
如果 Control(控件) 是启用的则检索 1, 禁用控件时检索 0.
ControlGet, OutputVar, Enabled ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
如果 Control 是可见的则检索 1, 隐藏控件时检索 0.
ControlGet, OutputVar, Visible ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
检索 SysTabControl32 控件的标签页的序号.
ControlGet, OutputVar, Tab ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
首个选项卡为 1, 第二个为 2, 等等. 若要获取 Tab 控件中含有的选项卡(页面) 数量, 请参照此例:
SendMessage, 0x1304,,, SysTabControl321, WinTitle ; 0x1304 为 TCM_GETITEMCOUNT. TabCount = %ErrorLevel%
检索列表框或组合框中与 String 完全匹配的条目编号.
ControlGet, OutputVar, FindString, String , Control, WinTitle, WinText, ExcludeTitle, ExcludeText
控件中首个条目为 1, 第二个为 2, 依此类推. 如果没有找到匹配, 则 OutputVar 被置空且 ErrorLevel 被设置为 1.
检索列表框或组合框中当前选择的条目的名称.
ControlGet, OutputVar, Choice ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
要获取所选条目的位置, 请参照此例(只需使用下面开始两行中的其中一行):
SendMessage, 0x188, 0, 0, ListBox1, WinTitle ; 0x188 为 LB_GETCURSEL (对于列表框). SendMessage, 0x147, 0, 0, ComboBox1, WinTitle ; 0x147 为 CB_GETCURSEL (对于下拉列表或组合框). ChoicePos := ErrorLevel<<32>>32 ; 如果没有选中的条目, UInt 转换为 Int 时须 -1. ChoicePos += 1 ; 从基于 0 转换到基于 1, 这样首个条目被称为 1, 而不是 0.
获取编辑控件中的行数.
ControlGet, OutputVar, LineCount ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
所有的编辑控件至少含有一行, 即使控件是空的.
检索插入符号(插入点) 所在的编辑控件中的行号.
ControlGet, OutputVar, CurrentLine ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
首行为 1. 如果控件中选择了文本, 则 OutputVar 被设置为选区开始处所在的行号.
检索插入符号(文本插入点) 所在的编辑控件中的列号.
ControlGet, OutputVar, CurrentCol ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
首列为 1. 如果控件中选择了文本, 则 OutputVar 被设置为选区开始处所在的列号.
检索编辑控件中行 N 的文本.
ControlGet, OutputVar, Line, N , Control, WinTitle, WinText, ExcludeTitle, ExcludeText
行 1 为首行. 根据控件的性质, OutputVar 可能以回车符(`r) 或换车和换行符(`r`n) 结束. 如果指定的行号没有内容或不存在, 则 ErrorLevel 被置为 1 且 OutputVar 被置空.
检索在编辑控件中所选文本.
ControlGet, OutputVar, Selected ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
如果没有选择的文本, 则 OutputVar 会被置空且 ErrorLevel 被设置为 0(即没有错误). 某些类型的控件, 例如 RichEdit20A, 在某些情况下可能无法获取到正确的文本(例如 Metapad).
检索表示控件样式的 8 位十六进制数字.
ControlGet, OutputVar, Style ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
对于一些样式的列表, 请参阅样式表.
检索表示控件扩展样式的 8 位十六进制数字.
ControlGet, OutputVar, ExStyle ,, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
对于一些样式的列表, 请参阅样式表.
检索控件的窗口句柄(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
#1: 检索第一个编辑控件的第一行:
ControlGet, OutputVar, Line, 1, Edit1, Some Window Title
#2: 检索第一个选项卡控件的当前活动选项卡:
ControlGet, WhichTab, Tab, , SysTabControl321, Some Window Title if ErrorLevel MsgBox There was a problem. else MsgBox Tab #%WhichTab% is active.