AutoIt的。 HWND数组

时间:2015-03-27 01:04:07

标签: autoit

我对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个实例

2 个答案:

答案 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)