Martin,
I would say that both methods are working as designed. In your first
case you have a dedicated thread that looks at the active window every
200 milliseconds. In the second case you have setup a callback to occur
every 200 milliseconds. So you might ask isn't that the same <smile>?
Well, in theory maybe so but not in practice. Again, in the first case
you have not given up control of your thread. It just waits 200 ms and
goes on. In the second case, you have given up control of your thread
and setup a timer callback. Timers have a very low priority. The only
thing with a timer that you are guaranteed is that it will not fire
before your timeout value. But because it is low on the totem pole (so
to speak) it lets things with higher priority execute first and when
there is nothing better, than it will fire your callback. So one time
it may be 230 ms than maybe 400 ms and so on.
I'm not totally sure I see what you are trying to do but I would argue
that neither approach is good. You shouldn't be polling over and over
for what the active window is. For one thing, you could easily miss a
window that got activation and it just eats unneeded cpu from your
system. What you should do is use the OnChildActive callback. If you
set this up whenever the active window changes, Window-Eyes will call
your function for you. This means you don't have to sit in some loop
checking and you are guaranteed you'll see every active window when and
only when it changes.
Doug
On 1/31/2012 5:09 AM, martin webster wrote:
Hi all,
I use the following vbscript routine to make windo-eyes wait until the correct
window is active, before setting an object reference to my window of choice. I
wrote the first routine rapidly using do until loop and sleep commands and this
never fails. However, thinking that using the StartTimer object would be a much
better aproach I rewrote the routine to use this object, and now instead of 30
children in the active window I now have three, or sometimes 4. I have to write
such a routine as if this software is not registered you get a trial days
counter window and options to purchase the software. this is not the same
window as I am wanting to script for. I am scripting for baygenie pro auction
sniping software.
Now follows the first routine and the one that works:
Begin VBScript
Function ChecWindow()
Dim CheckWinObj
Set CheckWinObj = ActiveWindow
Do Until(Left(CheckWinObj.Title, 32)) = "BayGenie eBay Auction Sniper Pro"
Sleep 200
Set CheckWinObj = ActiveWindow
Loop
Set CheckWinObj = Nothing
ActiveWindow.Redraw
Sleep 200
Speak "loop ended"
End Function
Out put:
children count 30
1 tooltips_class32
2 IME
3 ReBarWindow32
4 AfxMDIFrame70u
5 msctls_statusbar32
6 MSCTFIME UI
7 ToolbarWindow32
8 #32770
9 AfxMDIFrame70u
10 AfxFrameOrView70u
11 Button
12 Static
13 Static
14 SysTreeView32
15 #32770
16 ReBarWindow32
17 AfxFrameOrView70u
18 MFCGridCtrl
19 ToolbarWindow32
20 #32770
21 Shell Embedding
22 Button
23 Edit
24 Button
25 ComboBox
26 Button
27 Static
28 Static
29 Shell DocObject View
30 Internet Explorer_Server
This is correct.
Now for the second routine written with the StartTimer object.
Begin VBScript
Function ChecWindow()
Dim CheckWinObj
Set CheckWinObj = ActiveWindow
If(Left(CheckWinObj.Title, 32)) = "BayGenie eBay Auction Sniper Pro" Then
Speak "timer ended"
Set CheckWinObj = Nothing
ActiveWindow.Redraw
Sleep 200
Else
StartTimer 200, "ChecWindow"
end If
End Function
Output
children 4
1 Static
2 Shell Embedding
3 Shell DocObject View
4 Internet Explorer_Server
I don't understand.
Warm regards.
Martin Webster.