自动化。 HWND 数组

Autoit. Array of HWND

我是 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是空的,尽管在控制台输出中有3个实例

默认情况下,AutoIt 将使 WinList 从标题开始匹配 window 个标题。

记事本应用程序将 "Notepad" 放在标题的末尾。

因此您将 windows 命名为 "Untitled - Notepad" 和 "test.txt - Notepad"。 AutoIt 不会用 WinList ('Notepad') 找到它们,因为它正在寻找标题开头的 "Notepad"。

要做的是告诉它匹配部分 window 标题。

如果将其添加到脚本顶部附近(即 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 - 注意 link 到 "Title special definition"

讨论Window匹配模式: https://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm

设置这些选项的参考: https://www.autoitscript.com/autoit3/docs/functions/AutoItSetOption.htm#WinTitleMatchMode

如果我 运行 上面的代码,控制台不会输出任何内容,因为 $NotepadList[0][0] 是 0。这是因为默认情况下,window 匹配函数 WinList 通过匹配 window 标题的第一部分而不是子字符串来工作。要解决此问题,请添加

Opt("WinTitleMatchMode", 2)

在程序的顶部,以便在 window 标题中强制执行子字符串匹配。

此外,_ArrayAdd 函数将不起作用,因为 $NotepadHWNDList 未定义为数组。要将其定义为数组,您需要添加索引说明符。因此,将您的变量定义更改为

Local $NotepadHWNDList[0]

您可以使用值 0,因为您不知道将有多少 windows,并且数组会自动扩展。

所以现在您的整个程序将如下所示:

#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)