Hey Rick

 

Just to be curious, what kind of external application are you writing?

 

 

From: RicksPlace [mailto:ofbgm...@mi.rr.com] 
Sent: Wednesday, April 06, 2011 12:18 PM
To: gw-scripting@gwmicro.com
Subject: Re: External Script MSAAEvent Problem continued

 

Thanks Ron. I know you guys are busy and external scripts might not be a
good performance option anyway.

If you want me to do anything just let me know.

Later:

Rick USA

----- Original Message ----- 

From: Ron Parker <mailto:r...@gwmicro.com>  

To: gw-scripting@gwmicro.com 

Sent: Wednesday, April 06, 2011 12:08 PM

Subject: Re: External Script MSAAEvent Problem continued

 


We're looking into this. As of right now, we can't rule out the possibility
that a bug has crept into the implementation of WatchEvent. If so, we'll of
course fix it and see what we can do about developing a workaround you can
use until the fix hits the streets.

On 4/6/2011 11:31 AM, RicksPlace wrote: 

Hi Ron and Chip:
I hope the following clears up a couple of questions I have seen in a couple
of posts on this subject.
If you know of an external sample script using MSAA Processing, preferrably
the OnFocus event, let me know so i can look at it and we can try to avoid
the following mess...

 

OK. I reviewed things at the Application Programming level. That is I
reviewed the docs on how to handle events in VB.net, the WindowEyes Docs on
the events I subscribe to in my script and my script code related to these
events.
In VB.net you usually use the Handles clause to subscribe to an event. The
Handles clause indicates which Sub to fire when a subscribed event is
triggered.
There are other ways of doing this,including the use of delegates,  but this
is the most robust and commonly used method.
In my code I have the OnShutdown event wired up using the following
statements and they work:

 

' The following is a global variable
Public WithEvents MyClientInformation As WindowEyes.ClientInformation
' In the Main Sub
' Set Up the ClientInformation
Try
MyApp.ClientIdentify(System.Diagnostics.Process.GetCurrentProcess().Id )
MyClientInformation = MyApp.ClientInformation
MyClientInformation.ScriptName = "RicksWEComScript"
MyClientInformation.ScriptDescription = "This is my test script for the
vb.net interface"
MyClientInformation.ScriptHelp = "This is a help string in ClientInfo."
Logger.WriteLine( "ClientInformation Initialized OK")
Catch ex As Exception
Logger.WriteLine( "ProblemInitializing ClientInformation in MainSub")
Logger.WriteLine( ex.ToString())
End Try
' The sub in the module
Private Sub clientInformation_OnShutdown() _
Handles MyClientInformation.OnShutdown
Speech.Speak( "Shutting Down Now, ByeBye")
Logger.WriteLine( "Shutting Down Now")
Application.Exit()
End Sub
The above setup works as I would expect. 
I create an instance of the ClientInformation Object called
MyClientInformation. 
I subscribe to It's events via the WithEvents Clause.
When any event on MyClientInformation has been triggered, 
My App automatically handles the event based on the Handles Clause of the
above subroutine.

 

Here is the code to the BlockEvent which also seems to be working:
' Global variable
Public blockFocusEvent As WindowEyes.MSAAEventBlock
' In the Main sub
' Initialize the BlockFocusEvent
Try
BlockFocusEvent = MyMSAAEventSource.BlockEvent(
WindowEyes.MSAAEventID.event_OBJECT_FOCUS,
MyClientInformation.ApplicationProcess )
Logger.WriteLine( "BlockFocusEvent Initialized OK.")
Catch ex As Exception
Logger.WriteLine( "Error Initializing the BlockFocusEvent")
Logger.WriteLine( ex.ToString())
End Try
Note that the BlockEvent is a method of the MSAAEventSource object as is the
WatchEvent method.
The Block event seems to be working and returns a variable to use to unblock
as you mentioned in your post.
Question: The WatchEvent is a sub and does not return a variable so it seems
to function diferently with no variable to set to nothing to disable the
WatchEvent. How would this be accomplished?
Finally:
Here is the code related to the OnFocus Event:
' Declare the Global variable with events as with the MyClientInformation
Public WithEvents MyMSAAEventSource As WindowEyes.MSAAEventSource
' Initialize MyMSAAEventSource and Filter on Process
' In the Main sub
Try
MyMSAAEventSource= MyApp.MSAAEventSource 
MyMSAAEventSource.Process = MyClientInformation.ApplicationProcess
Logger.WriteLine( "MyMSAAEventSource Initialized and Filtered OK")
Catch ex As Exception
Logger.WriteLine( "Error initializing MSAAEventSource")
Logger.WriteLine( ex.ToString())
End Try
' Notice this sub uses the handles clause the same way as the 
handles clause of MyClientInformation.OnShutdown sub which works.
' The sub in the module
Private Sub MSAAEventSource_OnObjectFocus( AccObj As WindowEyes.Accessible )
_
Handles MyMSAAEventSource.OnObjectFocus
If AccObj Is Nothing Then
Logger.WriteLine( "Hit: AccObj was nothing in sub")
Speech.Speak( "Hit in the focus sub")
Else
Logger.WriteLine( "Hit: AccObj was nothing")
Speech.Speak( "Hit in the focus sub")
End If
If Not AccObj Is Nothing Then
AccObj.SimulateEvent( WindowEyes.MSAAEventID.event_OBJECT_FOCUS,
WindowEyes.AccessibleProperty.apAll)
End If
End Sub
Note: Since I handle the OnFocus event the same way as the OnShutdown event
which is working, I can't seem to figure out why the OnFocus event is not
causing the sub to fire.
It is mmy guess that the windoweyes notification of an OnFocus event should
come from the MyMSAAEventSource object as the event notification does for
the OnShutdown event of the MyClientInformation object.

 

Now, Ron: 
This is major wierd...
I just completed creating a Global VBScript to go along with Chip's
Windoweyes class.
It uses a ConnectEvent to a MSAAEventSource to connect to the OnFocus Event
inside the VBScript.
After testing my VBScript I considered that script complete.
I ReVisited my VB.net script to see if I could figure something out to solve
my problem with the VB.net script.
I just opened CSharp, the Associated Application to my VB.net script, and
the OnFocus event fired and was working properly!
I found out that if I had my VBS Global Script running that my VB.net
Script's OnFocus event works as expected - likely due to the ConnectEvent in
the Global VBScript?
If I turn off, stop, the Global VBScript, My VB.net Script's OnFocus event
does not work again.
Also, If I close the CSharp App, and thus the associated VB.net Script and
ReStart CSharp again, the OnFocus Event of the VB.net script does not work.
This is the case until I ReBoot my computer in which case My Vb.net script
will process the OnFocus event the first time I open the CSharp.net program
and thus my VB.net script, 
so long as my Global VBScriptt with the ConnectEvent method is running.

 

I have no clue as to what is going on except that the Event Handling event
connection seems to be bleeding between my VBScript script and my VB.net
script.
Things I might shotgun if you have no ideas:
Try and replace the Handles clause methodology with a direct Delegate
function hookup if the necessary details are available, 
Try and instantiate and execute a second instance of the main process as you
did in your sample although this should not be necessary from my
understanding of how Microsoft handles instantiation of a new Main Process.
Also, along these lines, I originally had my code in the instance of the
Pump Class which was run explicitly and had the exact same results as I did
subsequent to moving all the logic into the Main Module.
That makes me think that the problem is not dependent on the instance that
is run directly itself.
So, any ideas or perhaps examples you can suggest?
ThanksGuys  for any ideas or suggestions:
PS, I may not even end up using an external script for some performance
reasons I seem to be running into but getting it working in the first place
would let me explore this situation prior to giving up.

Rick USA

 

 

 

Reply via email to