Martin,

The window you pass into ConnectEvent tells window-Eyes you want only children of that window that get activation to fire the event. You just got whatever window was active at the moment and used it. Very likely there is no child window of that window that ever gets activation.

You should do the following:

Dim OnChildWindowEvent
OnChildWindowEvent = ConnectEvent(DesktopWindow, "onChildActivate", "OnChildActivate")
Function OnChildActivate(WinObj)
Speak "child window activated"
End Function

This passes in the DesktopWindow which is the top most window. All windows are children of the desktop so you'll get them all now.

Doug


On 2/1/2012 12:53 PM, martin webster wrote:
Hi Doug,
Thanks for your reply, but how do I use the OnChildActivate event. Blow I have 
written a global routine which should hook the activate window of any ap 
running and tell me if a child window gains activation, but it doesn't seem to 
work. What have I got wrong.

Begin VBScript:

Dim OnChildWindowEvent, WinObj
Set WinObj = ActiveWindow
OnChildWindowEvent = ConnectEvent(WinObj, "onChildActivate", "OnChildActivate")
Function OnChildActivate(WinObj)
Speak "child window activated"
End Function

Warm regards.
Martin Webster.


--- On Tue, 1/31/12, Doug Geoffray<[email protected]>  wrote:

From: Doug Geoffray<[email protected]>
Subject: Re: differences in window count when using startTimer
To: [email protected]
Date: Tuesday, January 31, 2012, 2:41 PM
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.



Reply via email to