ListViewGetContent

返回列表视图控件(如行, 列或计数值) 的内容数据.

Data := ListViewGetContent(Options, ControlID, WinTitle, WinText, ExcludeTitle, ExcludeText)

参数

Options

类型: 字符串

指定检索什么. 如果为空或省略, 则返回该控件中的所有行. 否则, 指定零个或多个下列单词, 每个单词之间用空格或制表符分隔:

Selected: 只返回选中 的行, 而不是所有行. 如果没有, Data 被置空.

Focused: 只返回聚焦行. 如果没有, Data 被置空.

ColN 仅获取第 N 列(字段) 而不是所有列. 把 N 替换为您选择的数字. 例如, Col4 返回第四列.

Count: 返回控件中的总行数.

Count Selected: 返回选中行的数量.

Count Focused: 返回聚焦行的行号(位置)(如果没有, 则返回 0).

Count Col: 返回控件中的列数(如果无法确定列数, 则返回 -1).

ControlID

类型: 字符串, 整数对象

控件的 ClassNN, 文本或 HWND, 或具有 Hwnd 属性的对象. 有关详情, 请参阅控件标识符. 该参数是必需的; 也就是说, 不能省略.

WinTitle, WinText, ExcludeTitle, ExcludeText

类型: 字符串, 整数对象

如果这些都是空白或省略, 将使用最后找到的窗口. 否则, 为 WinTitle 指定窗口标题或其他条件来标识目标窗口, 和/或为 WinText 指定目标窗口的单个文本元素的子字符串(由包含的 Window Spy 实用程序显示). 如果 DetectHiddenText 已经打开, 则检测隐藏文本元素. 标题或文本包含 ExcludeTitleExcludeText 的窗口将不被考虑.

窗口标题和文本是区分大小写的. 默认情况下, 不会检测隐藏的窗口, 但会检测隐藏的文本元素, 除非通过 DetectHiddenWindowsDetectHiddenText 进行更改. 在使用纯 HWND 时, 总是会检测隐藏的窗口. 默认情况下, 窗口标题中可以在任意位置包含 WinTitleExcludeTitle 以达成匹配, 除非通过 SetTitleMatchMode 进行更改.

返回值

类型: 字符串整数

此函数会根据指定的选项返回一个行列表或者一个计数值.

在返回行列表时, 除了最后一行之外, 每一行都会以换行符(`n) 结尾. 在每一行中, 除了最后一列之外的每一列都会以制表符(`t) 结尾.

错误处理

如果找不到窗口或控件, 则抛出 TargetError.

如果消息无法发送到控件, 或拥有列表视图控件的进程无法打开, 这可能是由于缺少用户权限或因为它已被锁定, 则抛出 OSError.

如果 ColN 选项指定不存在的列, 则抛出 ValueError.

备注

此函数适用于非图形用户界面窗口中的控件, 即那些并非通过 Gui 函数创建的窗口. 这个函数最适用于常见的或预定义的 Microsoft 控件; 而某些应用程序则使用自定义或修改后的控件, 在这种情况下, 函数可能无法按预期工作. 对于 GUI 控件, 通常使用它们的内置检索方法更方便.

一些应用程序将其控件数据单独存储, 从而防止 AutoHotkey 检索它们的文本. 在这些情况下, 通常不会抛出异常, 但是所有检索到文本都是空的.

另外, 列表视图控件中的列可以通过 SendMessage 进行调整大小, 如下例所示:

SendMessage(0x101E, 0, 80, "SysListView321", WinTitle)  ; 0x101E 是 LVM_SETCOLUMNWIDTH.

在上面, 0 表示第一列(第二列指定 1, 2 为第三列, 依此类推). 此外, 80 是新宽度. 用 -1 替换 80 以自动调整列大小. 将其替换为 -2 即可执行相同操作, 但还要考虑标题文本的宽度.

ControlGetItems, WinGetList, GUI ListView control, 控件函数

示例

从用户图形界面或非用户图形界面窗口的列表视图控件中提取各个行和字段.

List := ListViewGetContent("Selected", "SysListView321", WinTitle)
Loop Parse, List, "`n"  ; 行由换行符(`n) 分隔.
{
    RowNumber := A_Index
    Loop Parse, A_LoopField, A_Tab  ; 每行中的字段(列) 由制表符(A_Tab) 分隔.
        MsgBox "Row #" RowNumber " Col #" A_Index " is " A_LoopField
}