自动化。 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)
我是 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)