Rick,

I don't have all the answers, but I will endeavor to answer your questions to the best of my ability below.


On 2/24/2009 10:50 AM, Ricks Place wrote:
I am slogging through some GW scripts trying to figure out what is going on. In Audition and a couple of others they seem to be connecting to the running application by connecting to some of it's MSAA Events I guess. In the Audition script they seem to be using a variable called accObject as a reference to something in the Running Application. First, where are they getting the reference and defining the accObject variable value?

The MSAA data is first connected to an application through the MSAAEventSource object. For example, the following lines set an object to the event source, and the next one connects an MSAA event.
Dim myMSAAEventSource : Set myMSAAEventSource = MSAAEventSource
Dim msaaEventOnObjectFocus : msaaEventOnObjectFocus = ConnectEvent(myMSAAEventSource, "OnObjectFocus", "OnObjectFocus")

Notice that I created a variable called msaaEventOnObjectFocus. The ConnectEvent function will always return a number that references the specific event, and by storing the event's reference, we can always check if the event has already been hooked, and we can later disconnect it if we need to. It's a good idea to always store these references so you don't accidentally connect the same event multiple times. If you do, then Window-Eyes will execute the sub or function for as many times as you connected the event. Believe me, this can get ugly.

So, to put the above explanation into practice, my ConnectEvent routines always look like:
Dim msaaEventOnObjectFocus
If msaaEventOnObjectFocus = 0 Then ' 0 means the event hasn't been connected. msaaEventOnObjectFocus = ConnectEvent(myMSAAEventSource, "OnObjectFocus", "OnObjectFocus")
End If

Now let's say I want to disconnect the event for some reason.
If msaaEventOnObjectFocus> 0 Then ' A number other than 0 indicates the event has been connected.
Disconnect msaaEventOnObjectFocus
End If

Now as for this mysterious acc object, its presence is explained in the events of the MSAAEventSource object. When you connect an MSAA event, you must create your function to accept a single Accessible object, or accObj for short. To continue the previous example, the callback for the OnObjectFocus might look like this:

Sub OnObjectFocus(accObj)
If Not accObj Is Nothing Then
'... do something with the object.
End If
End Sub

Note: you could just as easily call accObj anything you want: oAccessible, cousinFrank, focusObject, etc. We stick to accObj to keep things consistent. All of the 50 MSAA events take an Accessible object as a parameter. Using WeEvent to monitor your application's MSAA stuff will help you quickly find which events you need to watch and how best to deal with the information they present.

The Accessible object is explained in detail in the scripting docs. Also look at Accessibles, AccessibleState, and AccessibleRole. In my experience, the hardest part of working with MSAA was determining how to connect events into a script to get the Accessible objects in the first place.

Second, I want to set and change properties in a DataGridView in the Running Application
That means modify the existing instance of the control
So, how do I get a reference to the control so I can access it's properties and methods?

Use the Window.Control method to return a reference to the grid. If the control can be focused with the keyboard, I would move my cursor to it, open the Window-Eyes immediate mode script, and enter
Dim gridControl : Set gridControl = FocusedWindow.Control()

Now I could do whatever I want with it. Or, if I wanted to look at the MSAA info for the control, I would type
Dim accObj : Set accObj = FocusedWindow.Accessible

Then I could start examining the object I got:
Print accObj.Name
Print accObj.Value
And so on.

In VBS I think the Create or GetObject would be used but what about in Windoweyes?

You only need to use CreateObject and GetObject if you want to interact with a Com object that's produced by the program you're working with. The free editions of Visual Studio offer no Com automation support, so you wouldn't use these methods.

One more thing, what is an Overlp? From what I learned it was something on a screen overlapping another item, here it looks like they mean the Running Application. Is this the case?

An overlap represents the top-level window of a program. If you had an object that was set to your grid view, then calling its Overlap method would return a Window object representing the Visual Studio editor.

Hope this helps.
Steve


Reply via email to