Using Automation
Most voice commands control an application via its user interface (UI), by simulating keystrokes and mouse clicks.
UI commands are very useful but can be fragile, for example if they require a waiting period of just
the right length or clicking particular screen coordinates.
For some applications there's a better way—using an automation interface. For
example, MS Office and MS Visual Studio support rich
automation interfaces. By writing a Vocola extension which invokes automation methods you can make it easy to
create voice commands which control the application more reliably and expressively.
For an example, see the VisualStudio sample extension
in ExtensionSamples\VisualStudio in the Vocola installation folder. Among
other capabilities it lets you refer to a visible line by its line number's last two digits, and implements
Emacs-style word navigation (much better than Visual Studio's built-in navigation, in the author's opinion).
The sample commands for Visual Studio include commands which call these
extension methods. (To see them, start Visual Studio and say "Open Sample Commands").
Circumventing User Account Control (UAC) restrictions
The Vocola API includes a helper method to work around an annoying barrier to using automation interfaces.
Windows "User Account Control" (UAC) prevents Vocola from connecting to a running application because they
have different security levels.
One solution is to just disable UAC so your extension can connect to an automation server directly. But if you
prefer to keep UAC enabled you can instead use the Vocola API
method GetAutomationObject to connect. It creates a separate process with a "normal"
security level and marshals function calls through that. See the VisualStudio
extension for an example. It connects to a running instance of Visual Studio this way:
dte2 = (DTE2)VocolaApi.GetAutomationObject("VisualStudio.DTE");
|
The dte2 object may then be used to invoke
any Visual Studio automation interface
method.
Using GetAutomationObject works well, though it appears to have one drawback—if
an automation call returns an object rather than a simple type you can't pass that object as an argument in
another call. But you can accomplish a lot without hitting this restriction. Or you can disable UAC.
Heavy use of the sample Visual Studio extension has revealed an intermittent issue—after a few days of
voice interaction the extension may sometimes hang for about 90 seconds, during which time both Vocola and
Visual Studio are unresponsive. If you wait it out, everything is usually OK.