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. > > > > > > > >
