AutoHotkey:如何从WinGet获取基于对象的数组并传递给函数?
在AutoHotkey中直接获取WinGet的对象数组并传递给函数
嘿,刚好碰到过类似的需求!你说得没错,WinGet命令默认返回的是伪数组(靠OutputVar0存长度、OutputVar1/2/...存元素的那种),直接传给函数确实有点麻烦,手动挨个转对象数组也显得没必要。其实AutoHotkey早就给我们准备了更高效的方案——用WinGetList()函数,它直接返回基于对象的数组,完美适配函数传递的需求。
核心方案:用WinGetList()直接拿对象数组
WinGetList()是专门用来获取窗口句柄数组的函数,返回的就是标准的对象数组,每个元素对应一个窗口的句柄。用法和WinGet命令的WinTitle参数完全兼容,上手毫无门槛:
1. 基础用法示例
; 获取所有顶层窗口的对象数组 winHandles := WinGetList() ; 或者指定窗口标题,比如找所有记事本窗口 winHandles := WinGetList("Notepad") ; 甚至可以加上WinText、排除条件,和WinGet命令一致 winHandles := WinGetList("Notepad", "Edit", "Untitled")
2. 直接传递给函数
拿到这个数组后,直接传给函数就行,对象数组在函数里的操作也更灵活:
; 定义一个处理窗口数组的函数 ProcessWindows(winArray) { ; 对象数组可以直接用.Length()获取元素个数 Loop % winArray.Length() { currentHandle := winArray[A_Index] WinGetTitle, winTitle, ahk_id %currentHandle% MsgBox, 第%A_Index%个窗口:%winTitle% } } ; 调用函数,直接传对象数组 winHandles := WinGetList("Notepad") ProcessWindows(winHandles)
特殊场景:必须用WinGet命令的子命令怎么办?
如果你的需求需要用到WinGet命令的其他子命令(比如ProcessName、Path这类返回非句柄内容的),那可以写个简单的工具函数一键把伪数组转成对象数组——其实这个转换的效率并没有你担心的那么低,而且代码很简洁:
; 伪数组转对象数组的工具函数 PseudoToArray(pseudoVarPrefix) { objArray := [] ; 先拿伪数组的元素总数 elementCount := %pseudoVarPrefix%0 Loop % elementCount { ; 按伪数组的命名规则取元素,加入对象数组 objArray.Push(%pseudoVarPrefix%%A_Index%) } return objArray } ; 使用示例:获取所有窗口的进程名并转成对象数组 WinGet, procNames, ProcessName procArray := PseudoToArray("procNames") ; 现在就可以把procArray传给函数了 ProcessProcNames(procArray) ; 处理进程名数组的函数 ProcessProcNames(procArray) { for index, procName in procArray { MsgBox, 进程名:%procName% } }
补充:AutoHotkey v2的情况
如果你用的是AHK v2,那更省心——WinGet相关的函数默认返回的就是对象数组,语法更直观:
; AHK v2 示例 winHandles := WinGetList("Notepad") ProcessWindows(winHandles) ProcessWindows(winArray) { for winHandle in winArray { winTitle := WinGetTitle("ahk_id " winHandle) MsgBox "窗口标题:" winTitle } }
总的来说,只要是获取窗口句柄的需求,WinGetList()就是最优解,不用额外转换,直接拿到可传递的对象数组,效率拉满。
内容的提问来源于stack exchange,提问作者minion
相关产品推荐
相关产品推荐

