An example of UIAutomation
Not logged in
This forum is sponsored by Mistachkin Systems.
Eagle: Secure Software Automation
My first guess is that you’ll want to use the .NET 4.0 build of Eagle to do this (i.e. for compatibility with all the necessary assemblies).

EDIT #1: Slightly revised example that is tested and working on Windows 7 (32-bit) using the .NET Framework 4.0.

EDIT #2: Also, you may want to upgrade to the latest Eagle release (beta 50).

EDIT #3: Yeah, it’s a bit atypical to use the .NET Framework 2.0 (CLR v2) build of Eagle running on the .NET Framework 4.x (CLR v4).

object load UIAutomationClient
object load UIAutomationTypes
object load UIAutomationProvider

set assembly [object load -alias UIAutomationClientsideProviders]

object import System.Windows.Automation

object invoke ClientSettings \
    RegisterClientSideProviderAssembly [$assembly GetName]

set prop(pid) [object invoke AutomationElement ProcessIdProperty]
set prop(class) [object invoke AutomationElement ClassNameProperty]
set prop(name) [object invoke AutomationElement NameProperty]
set patt(invoke) [object invoke InvokePattern Pattern]

# optional, close calc.exe
# kill -all calc.exe

set pid [exec calc.exe &]
set pidObject [object invoke -create Int32 Parse $pid]
after 2000; # wait for calc.exe input idle?

set elem(root) [object invoke -alias AutomationElement RootElement]

set cond(1) [object create PropertyCondition $prop(pid) $pidObject]
set elem(pid) [$elem(root) -alias FindFirst Children $cond(1)]

set cond(2) [object create PropertyCondition $prop(class) Button]

if {0} then {
  #
  # NOTE: Show all the button names within the target window.
  #
  object foreach -alias elem(this) \
      [$elem(pid) -alias FindAll Descendants $cond(2)] {
    puts stdout [$elem(this) GetCurrentPropertyValue $prop(name)]
  }
}

set cond(3) [object create PropertyCondition $prop(name) 1]
set cond(4) [object create AndCondition $cond(2) $cond(3)]
set elem(btn1) [$elem(pid) -alias FindFirst Descendants $cond(4)]

set cond(5) [object create PropertyCondition $prop(name) Add]
set cond(6) [object create AndCondition $cond(2) $cond(5)]
set elem(btn+) [$elem(pid) -alias FindFirst Descendants $cond(6)]

#
# HACK: Apparently, name for plus button can be different?
#
if {![isNonNullObjectHandle $elem(btn+)]} then {
  unset cond(5) cond(6) elem(btn+); # dispose?
  set cond(5) [object create PropertyCondition $prop(name) +]
  set cond(6) [object create AndCondition $cond(2) $cond(5)]
  set elem(btn+) [$elem(pid) -alias FindFirst Descendants $cond(6)]
}

set cond(7) [object create PropertyCondition $prop(name) Equals]
set cond(8) [object create AndCondition $cond(2) $cond(7)]
set elem(btn=) [$elem(pid) -alias FindFirst Descendants $cond(8)]

#
# HACK: Apparently, name for equals button can be different?
#
if {![isNonNullObjectHandle $elem(btn=)]} then {
  unset cond(7) cond(8) elem(btn=); # dispose?
  set cond(7) [object create PropertyCondition $prop(name) =]
  set cond(8) [object create AndCondition $cond(2) $cond(7)]
  set elem(btn=) [$elem(pid) -alias FindFirst Descendants $cond(8)]
}

[$elem(btn1) -alias GetCurrentPattern $patt(invoke)] Invoke
after 1000

[$elem(btn+) -alias GetCurrentPattern $patt(invoke)] Invoke
after 1000

[$elem(btn1) -alias GetCurrentPattern $patt(invoke)] Invoke
after 1000

[$elem(btn=) -alias GetCurrentPattern $patt(invoke)] Invoke
after 1000

# optional, close calc.exe
# kill $pid