我对Autoit完全不熟悉,我想知道,如果有办法创建一个HWND数组? 我需要存储它们并在循环中遍历每个。
#include <Array.au3>
Local $NotepadList
Local $NotepadHWNDList
$NotepadList= WinList('Notepad')
For $i = 1 To $NotepadList[0][0]
Local $tmpHWND = $NotepadList[$i][1]
ConsoleWrite($tmpHWND & @CRLF)
_ArrayAdd($NotepadHWNDList, $NotepadList[$i][1])
Next
结果$NotepadHWNDList
为空,但Console输出中有3个实例
答案 0 :(得分:2)
默认情况下,AutoIt将从标题的开头获得WinList匹配窗口标题。
记事本应用程序将“记事本”放在标题的末尾。
因此,您将拥有名为“Untitled - Notepad”和“test.txt - Notepad”的窗口。 AutoIt将找不到WinList ('Notepad')
,因为它正在标题的开头寻找“记事本”。
要做的是告诉它匹配部分窗口标题。
如果您将其添加到脚本顶部附近(即WinList
指令之前的某处):
Opt("WinTitleMatchMode", 2) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase
应该这样做。
AutoIt WinList参考: https://www.autoitscript.com/autoit3/docs/functions/WinList.htm - 请注意“标题特殊定义”的链接
讨论窗口匹配模式: https://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm
设置这些选项的参考: https://www.autoitscript.com/autoit3/docs/functions/AutoItSetOption.htm#WinTitleMatchMode
答案 1 :(得分:2)
如果我在上面运行该代码,则不会向控制台输出任何内容,因为$NotepadList[0][0]
为0.这是因为默认情况下,窗口匹配函数(如WinList
)通过匹配窗口的第一部分来工作标题,而不是子字符串。要解决此问题,请添加
Opt("WinTitleMatchMode", 2)
位于程序顶部,以便在窗口标题中强制执行子字符串匹配。
此外,_ArrayAdd
函数无法正常工作,因为$NotepadHWNDList
未定义为数组。要将其定义为数组,需要添加索引说明符。因此,将变量定义更改为
Local $NotepadHWNDList[0]
您可以使用值0,因为您不知道您将拥有多少个窗口,并且阵列将自动展开。
所以现在你的整个程序将如下所示:
#include <Array.au3>
Opt("WinTitleMatchMode", 2)
Local $NotepadList
Local $NotepadHWNDList[0]
$NotepadList = WinList("Notepad")
For $i = 1 To $NotepadList[0][0]
Local $tmpHWND = $NotepadList[$i][1]
ConsoleWrite($tmpHWND & @CRLF)
_ArrayAdd($NotepadHWNDList, $NotepadList[$i][1])
Next
; Display all array items
_ArrayDisplay($NotepadHWNDList)