6 posts in this topic
I am currently using Autoit's "WinList" function in an Autoit script, I fully understand it.
Autoit provides a nice Library for Word VBA so that Some of Autoit's functions can be used within a MSWord VBA script, some of which I am using.
I have a use for Autoit's "WinList" function which has been provided by AutoIt in their Library for MSWord VBA scripting. The WinList function Creates an array when run. MSWord VBA does not seem to allow this. To create an array in VBA you have to first DIM it, and this does not seem to work for the WinList function.
Dim AutoIt As New AutoItX3Lib.AutoItX3
MyArray= Autoit(WinList) produces an error, whether I dim the array or not.
It seems that AutoIt has provided a function for VBA that cant be used ??
Can someone figure out a way to use WinList within Word VBA?
So the code I use is as follows:
Local $InstancesList = WinList("[REGEXPTITLE:(?i)(.*Paint.*|.*WinAmp.*)]")
And then if this number changes, I do something. But once in a while I SEE a new window paint being opened but nothing happens.
So I added logs and printed the InstancesList and saw it did not pick up the new paint.
Now I also added a WinList with Class to doublecheck, but still now and then it fails. So I was wondering if this is a known problem, and whether there are alternatives of workarounds.
Hi, I use winlist to count the amount of instances of a specific window (in combination with a reg expression). Over multiple runs, it seems that it fails 1 in a hundred times more or less. Any idea how/why? And are there alternatives to use as a backup/check?
I get a database result back as sometimes as single array and sometimes multi array (I understand that is bad practice in general and I am trying to fix that, because there are some errors in my database)
but how can I error handle the best way or determine when something is single or multi array without making my script to break?
I am very poor at @error handling in such cases
for example $ncatid = $array
(because it is the answer i got back from database is multi array, that is because the item is unfortunate stored double which i am trying to fix in proper manner)
I get the error of, Array variable has incorrect number of subscripts or subscript dimension range exceeded
All my tests done on WinXP SP3, AutoItX v18.104.22.168
My AutoItX is not up-to-date, however the changelog does not record any change regarding this problem.
The issue is known :
* each call to o_AutoItX3Obj.WinList can consumme up to 4ko (in my tests),
which are not released even when exiting a sub or setting the o_AutoItX3Obj object to Nothing
-> this is a problem, for example, for ever-runnning scripts that do repetitive call to WinList
* a work-around : enumerate windows instead of using WinList
Option Explicit MAIN() Sub MAIN() Dim s_win_id, arr Dim o_AutoItX3Obj Set o_AutoItX3Obj = CreateObject("AutoItX3.Control") ' s_win_id : the advanced filter parameter that would have been used in the WinList function ' s_win_id : must not contain the INSTANCE parameter (it seems it just would be ignored) ' WinTitleMatchMode : the title match mode that would have been used with the WinList function ' WinSearchChildren : the child windows mode that would have been used with the WinList function ' *** EXAMPLE 1 *** ' s_win_id = "TITLE:a", with WinTitleMatchMode substring (=2), No WinSearchChildren (=0) ' there should be some of theses s_win_id = "TITLE:a" o_AutoItX3Obj.AutoItSetOption "WinTitleMatchMode", 2 o_AutoItX3Obj.AutoItSetOption "WinSearchChildren", 0 ' call the pseudo WinList function (ENUM_WIN) arr = ENUM_WIN(o_AutoItX3Obj, s_win_id) ' look for results SHOW_RESULTS o_AutoItX3Obj, s_win_id, arr ' *** EXAMPLE 2 *** ' s_win_id = "TITLE:a; REGEXPCLASS:a", with WinTitleMatchMode substring (=2), No WinSearchChildren (=0) ' there should be at least the 'Program Manager' [Class:Progman], which is the Windows desktop s_win_id = "TITLE:a; REGEXPCLASS:a" o_AutoItX3Obj.AutoItSetOption "WinTitleMatchMode", 2 o_AutoItX3Obj.AutoItSetOption "WinSearchChildren", 0 ' call the pseudo WinList function (ENUM_WIN) arr = ENUM_WIN(o_AutoItX3Obj, s_win_id) ' look for results SHOW_RESULTS o_AutoItX3Obj, s_win_id, arr End Sub Sub SHOW_RESULTS(ByVal o_AutoItX3Obj, ByVal s_win_id, ByVal arr) Dim s_res, i s_res = "Number of windows matching [" & s_win_id & "] : " & arr(0, 0) & vbCr s_res = s_res & "WinTitleMatchMode : " & o_AutoItX3Obj.AutoItSetOption("WinTitleMatchMode", 0) & ", " s_res = s_res & "WinSearchChildren : " & o_AutoItX3Obj.AutoItSetOption("WinSearchChildren", 0) & vbCr s_res = s_res & "(message boxes can cut long text)" & vbCr & vbCr s_res = s_res & "Num Handle" & vbTab & "Title" & vbCr & vbCr For i = 1 To UBound(arr, 2) s_res = s_res & i & ". " & arr(1, i) & vbTab & "[" & arr(0, i) & "]" & vbCr Next MsgBox s_res, vbInformation, WScript.ScriptName End Sub ' Re-usable code begins here (could be optimized if hundreds of matching windows are expected) ' ENUM_WIN returns an 2-Dim array, same formatting as by WinList function Function ENUM_WIN(ByVal o_AutoItX3Obj, ByVal s_win_id) Dim s_win_handle, s_win_title, arr, i ReDim arr(1, 0) arr(0, 0) = 0 ' will hold the number of found windows, like the WinList function arr(1, 0) = 0 ' will not be used i = 1 ' because Instances are 1-based Do s_win_handle = o_AutoItX3Obj.WinGetHandle("[" & s_win_id & "; INSTANCE:" & i & "]") If s_win_handle = "" Then Exit Do ' enumeration finished s_win_title = o_AutoItX3Obj.WinGetTitle("[HANDLE:" & s_win_handle & "]") ReDim Preserve arr(1, i) arr(0, i) = s_win_title ' title can be an empty string arr(1, i) = s_win_handle ' handle should always be a valid hex string number (32/64 bits ?) i = i + 1 Loop arr(0, 0) = i - 1 ' record the number of found windows ENUM_WIN = arr End Function
* note 1 :
enumerating windows could have timing issues if some windows matching the criteria
are appearing/disappearing while doing the enumeration... (I didn't test that)
* note 2 :
if it impossible to avoid memory leak in COM components returning arrays,
then WinList could return a simple string with titles/handles separated by Chr(0),
(assuming there are no Chr(0) inside window titles ?)
then the user would use the Split function to get an 1-Dim array : [title1, handle1, title2, handle2, title3, handle3] etc...
This string-type return could be an optional parameter given to the WinList function :
arr = o_AutoItX3Obj.Winlist("title" [, "text" [, return type]])