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