获取控件的各种类型的信息.
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 参数相互依赖, 其用法描述如下.
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 被设置为 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.