[jawsscripts] Re: An interesting scripting problem

  • From: Andrew Hart <ahart@xxxxxxxxxxxxx>
  • To: jawsscripts@xxxxxxxxxxxxx
  • Date: Sun, 06 May 2012 21:54:37 -0400

Awesome tip that about Insert+Windows+F4.  I am always forgetting that
and never thought to try it.

Thanks heaps,
Andrew.

On 6/05/2012 7:30 PM, Doug Lee wrote:
> My normal way to handle that, at least when looping through windows,
> is to stop if the window handle I get back is null. In this script,
> you can do that by changing the While line to read
> 
> while x && hWin1
> 
> This works because hWin1, when treated as a boolean value like that,
> will return True if non-empty and False when empty; and
> getNextWindow() returns null when it runs out of windows.
> 
> If you do get stuck in an infinite loop in a modern JAWS version
> though, you can escape it and shut down JAWS by typing
> Insert+Windows+F4.
> 
> On Sun, May 06, 2012 at 07:14:42PM -0400, Andrew Hart wrote:
> Correct me if I am wrong, but the while loop in this code makes me
> nervous as it seems rather dangerous.  The only way in which it can
> terminate is if a window with the desired control id is found.
> If the loop runs out of sibling windows to search, hWin1 and hWin2 will
> end up with the value 0, but x will never get set to False.
> In that case, the script will continue looping for ever, thus hanging JAWS.
> 
> If the window is guaranteed to exist, this is ok, but it would be good
> coding practice to include another loop termination condition as a
> safety net in case the application decides to behave badly or a future
> update to the application removes the guarantee that the window is
> always in the expected place.  The termination condition could be a
> simple counter to prevent the while loop iterating more than some
> limited number of times  that is considered reasonable (e.g. 10 or 20
> iterations would probably suffice).
> 
> Btw, if anything were to go wrong and the script failed to locate a
> window with the desired control id, the only way to recover from the
> infinite loop would be to punch the off button on the machine.  I have
> managed to drop JAWS into infinite loops on numerous occasions (due to
> an error in programming logic) and the result is not pretty and
> definitely an occasion for slapping one's forehead and thinking "idiot!"
>  Every time I do this I feel like that bowl of petunias in Douglas
> Adam's the Hitch-Hiker's Guide to the Galaxy:  "Oh no, not again."
> 
> Hth,
> Andrew.
> 
> On 6/05/2012 5:30 PM, Steve Matzura wrote:
>> An interesting take. Problem is, if the window isn't there, what kind
>> of error will I get back from the calling line?
>>
>> Anyway, I did solve the problem, and here's the script for it. Sorry
>> about the bad line-wrapping.
>>
>> include "hjconst.jsh"
>>
>> Script FocusSearchList ()
>>
>> ; This script, attached to CTRL+Shift+L, ensures
>> ; PC cursor is on a particular control before doing anything else.
>>
>> var handle hWin1, handle hWin2,
>>     int x
>>
>> let hWin1 = GetCurrentWindow ()
>> if GetControlID (hWin1) != 1001
>>      then
>>              SayMessage (ot_jaws_message, "Place the PC Cursor on
>> the search edit field before executing this script.", "PC Cursor to
>> search field first.")
>>              return
>> endif
>>
>> let hWin1 = GetParent(hWin1) ; Go up one level.
>> let x = TRUE
>>
>> while x
>>
>>      let hWin2 = GetNextWindow (hWin1) ; Go right one window.
>> if GetControlID (hWin2) == 1019 ; Window not accessible via normal tab
>> ; controls
>>      then
>>              SetFocus (hWin2) ; Force the PC Cursor to that window.
>>              let x = FALSE ; Terminate the while condition.
>>      else
>>              let hWin1 = hWin2 
>> ; Save the current window handle for the next go-round.
>>
>> Endif
>>
>> EndWhile
>>
>> ; Script should always find the window with control ID 1019 this way.
>> ; Question: What value would hWin2 have if it got to the 
>> ;rightmost window and couldn't find the one with control ID 1019?
>>
>> EndScript
>>
>>
>> On Sun, 6 May 2012 08:05:10 -0700, you wrote:
>>
>>> You can use the function IsWindowVisible()
>>> That will tell you if it is present or visible rather.
>>> John
>>> -----Original Message-----
>>> From: jawsscripts-bounce@xxxxxxxxxxxxx
>>> [mailto:jawsscripts-bounce@xxxxxxxxxxxxx] On Behalf Of Steve Matzura
>>> Sent: Sunday, May 06, 2012 7:34 AM
>>> To: jawsscripts
>>> Subject: [jawsscripts] An interesting scripting problem
>>>
>>> I'm scripting an application that has a window that's sometimes there,
>>> sometimes not. The first order of business is to check if the window is
>>> there, and if it is, set focus to it. I know the control ID of the window,
>>> 1019. I'm trying to use FindDescendantWindow with a start handle of 0 to
>>> verify its existence. My script so far looks like this:
>>>
>>> Script ReadSearchStatus ()
>>>
>>> var handle hwin
>>>
>>> let hwin = FindDescendantWindow (0, 1019)
>>>
>>> if hwin > 0
>>> then
>>> Say ("search window present.", ot_jaws_message, false)
>>>
>>> ; Insert code to set focus to the window. Should I even bother ; with this?
>>> ; Should I just try setting focus and if it fails, assume the window's ; not
>>> present?
>>>
>>> else
>>> Say ("search window is not present.", ot_jaws_message, false)
>>>
>>> endif
>>>
>>> EndScript
>>>
>>> The problem is, it always comes up saying the window is present, even when
>>> it's not.
>>> __________o?=
>>>
>>> View the list's information and change your settings at
>>> //www.freelists.org/list/jawsscripts
>>>
>>> __________???
>>>
>>> View the list's information and change your settings at 
>>> //www.freelists.org/list/jawsscripts
>>>
>> __________???
>>
>> View the list's information and change your settings at 
>> //www.freelists.org/list/jawsscripts
>>
>>
>>
> 
> 
> __________???
> 
> View the list's information and change your settings at 
> //www.freelists.org/list/jawsscripts
> 


__________�

View the list's information and change your settings at 
//www.freelists.org/list/jawsscripts

Other related posts: