AHK v1中如何通过ControlGet或其他方式同时获取SysListView32控件的列表项与列标题?
AHK v1中如何通过ControlGet或其他方式同时获取SysListView32控件的列表项与列标题?
你好呀!确实,ControlGet, List这个命令只能拿到SysListView32里的列表项内容,没法直接获取列标题——毕竟它的设计就是专门提取列表行数据的。不过咱们可以通过调用Windows原生API来实现这个需求,因为SysListView32是标准的Win32 ListView控件,支持对应的消息来获取表头信息。
下面是针对你场景的具体实现代码,直接就能用:
; 先获取目标ListView控件的句柄 ControlGet, hListView, Hwnd,, SysListView321, Options ahk_class #32770 ahk_exe Ditto.exe ; 获取表头控件的句柄(LVM_GETHEADER消息,值为0x101F) hHeader := DllCall("SendMessage", "Ptr", hListView, "UInt", 0x101F, "Ptr", 0, "Ptr", 0) ; 获取列的总数(HDM_GETITEMCOUNT消息,值为0x1200) columnCount := DllCall("SendMessage", "Ptr", hHeader, "UInt", 0x1200, "Ptr", 0, "Ptr", 0) ; 循环遍历每一列,获取列标题 columnHeaders := [] Loop, % columnCount { ; 初始化HDITEM结构体,指定要获取文本信息 VarSetCapacity(HDITEM, 40, 0) NumPut(0x00000001, HDITEM, 0, "UInt") ; HDI_TEXT标记,说明要提取文本 VarSetCapacity(title, 256, 0) ; 预分配标题存储空间 NumPut(&title, HDITEM, 20, "Ptr") ; 设置文本缓冲区指针 NumPut(256, HDITEM, 24, "Int") ; 设置缓冲区最大长度 ; 发送HDM_GETITEM消息获取指定列的标题(注意列索引从0开始) DllCall("SendMessage", "Ptr", hHeader, "UInt", 0x1201, "Ptr", A_Index-1, "Ptr", &HDITEM) ; 把提取到的标题加入数组(用UTF-16编码解析,因为Win32控件用宽字符) columnHeaders.Push(StrGet(&title, "UTF-16")) } ; 用你原本的方式获取列表项内容 ControlGet, listItems, List,, SysListView321, Options ahk_class #32770 ahk_exe Ditto.exe ; 输出结果,这里用MsgBox演示,你可以换成自己的Console函数 MsgBox, 列标题:`n%columnHeaders.Join(" | ")`n`n列表内容:`n%listItems%
代码说明:
- 第一步先拿到ListView控件的句柄,这是后续所有操作的基础
- 通过
LVM_GETHEADER消息获取表头控件的句柄,因为ListView的表头是一个独立的Header控件 - 用
HDM_GETITEMCOUNT拿到总列数,再循环每一列,通过HDM_GETITEM提取标题文本 - 最后把列标题和你原本获取的列表项内容结合起来,就能得到完整的表格数据啦
如果觉得手动写API调用有点麻烦,也可以找找社区里的AHK ListView工具函数集,但原生API的方法最可靠,不需要依赖任何外部库,兼容性也最好。
备注:内容来源于stack exchange,提问作者Ralf_Reddings
相关产品推荐
相关产品推荐

