Hi Martin,

In addition to Doug's answer, see class#22 for examples where we use
onChildActivate on the desktopWindow to search for a specific window coming
available (as you seem to need to do).

hth,

Chip
 

> -----Original Message-----
> From: martin webster [mailto:[email protected]] 
> Sent: Wednesday, February 01, 2012 12:54 PM
> To: [email protected]
> Subject: Re: differences in window count when using startTimer
> 
> 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