F#ならUIAutomation出来た!!
#r @"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\UIAutomationClient.dll";; #r @"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\UIAutomationTypes.dll";; open System open System.Windows.Automation let gc (e:AutomationElement) check = let el = e.FindAll(TreeScope.Children, Condition.TrueCondition) in let el_arr = Array.init el.Count (fun i -> el.Item(i)) in el_arr |> Array.to_list |> List.find (fun el -> check el.Current) ;; let el = gc (gc AutomationElement.RootElement (fun e -> e.ClassName = "SciCalc")) (fun e -> e.Name = "1") in (el.GetCurrentPattern(InvokePattern.Pattern) :?> InvokePattern).Invoke()
これで電卓のボタンが押せました!! この14行(実質8行程度)を書くのに3時間以上費やした……。The F# Manualをみながら作業したんですが、配列から要素を取り出す方法と、ObjectからInvokePatternにダウンキャストするところが難関だった……。
アップキャストは":>"、ダウンキャストは":?>"で出来るって事なんだろうか?
ちなみに、
open System open System.Threading ;; let str = Thread.CurrentThread.GetApartmentState().ToString() in printfn "%s" str
を実行すると、"MTA"となるので、IronRubyやPowerShellでうまくいかなかったのは、アパートメントのせいではないようです。