WinActorで無理やりUIAutomation制御する企画。
今日は、チェックボックスとラジオボタンの操作にチャレンジ。
1.CheckBoxコントロール
最初、普通にClick操作でInvokeしたらいいんじゃね?って思ったんだけども、結局それだとTrue/False状態を任意に制御できない。
チェック状況を取得しようとすると、ちゃんとAutomationElementからTogglePatternとして取得して操作しないといけないみたいですね。
ちなみに、取得されるステータスはON/OFF以外にIndeterminateというステータスが返ってくるみたいなので値のチェックにも注意が必要です。
取得するコードはこんな感じ
' TargetElmにはすでに操作対象のAutomationElementが取得できている状態 Dim TglPtn As TogglePattern = TargetElm.GetCurrentPattern(TogglePattern.Pattern) Console.WriteLine(TglPtn.Current.ToggleState = ToggleState.On)
対して、設定するコードはこんな感じ
' TargetElmには、すでに操作対象のAutomationElementが取得できている状態 Dim TglPtn As TogglePattern = TargetElm.GetCurrentPattern(TogglePattern.Pattern) Select Case StrConv(argVal, VbStrConv.Lowercase) Case "0", "false" If (TglPtn.Current.ToggleState = ToggleState.On) Then TglPtn.Toggle() End If Case "1", "true" If (TglPtn.Current.ToggleState <> ToggleState.On) Then TglPtn.Toggle() End If End Select
ToggleStateがIndeterminateで返る可能性があるので、Onかどうかで判定してToggleする感じで考えてみた。
DefaltがTrueのチェックボックスで取得結果がIndeterminateだけどもチェック入ってる状況っていうコントロールがもしあれば、操作が失敗することになる。
2.RadioButtonコントロール
内部的には、SelectionItemPatternになってるみたい。
ListViewの時は、SelectionPatternが親でSelectionItemPatternが子になっているツリー構造だったんだけどもUI的にきちんとフレームとかでグルーピングされていないRadioButtonはどのボタン同士がグルーピングされているのか判別できる項目が見当たらなくて、ただSelectionItemPatternが並んでるだけに見える。
てことは、プロパティ値としてはListViewの中で選択されている項目とRadioButtonの選択項目は同じ様にIsSelectedプロパティ見るだけで判定/設定できるってことですね。
前回のListView項目選択のコードを拡張する形で考えるとこうかな。
' TargetElmには、操作対象のAutomationElementが取得されている状態 ' ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ' 値の取得 Dim ptnVal As SelectionItemPattern = TargetElm.GetCurrentPattern(SelectionItemPattern.Pattern) Console.WriteLine(ptnVal.Current.IsSelected) ' ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ' 値の設定 If (TargetElm.GetCurrentPropertyValue(AutomationElement.IsSelectionPatternAvailableProperty)) Then Dim itemElm As AutomationElement = TargetElm.FindFirst(TreeScope.Subtree, New PropertyCondition(AutomationElement.NameProperty, argVal)) Dim ptnVal As SelectionItemPattern = itemElm.GetCurrentPattern(SelectionItemPattern.Pattern) ptnVal.Select() ElseIf (TargetElm.GetCurrentPropertyValue(AutomationElement.IsSelectionItemPatternAvailableProperty)) Then Dim ptnVal As SelectionItemPattern = TargetElm.GetCurrentPattern(SelectionItemPattern.Pattern) ptnVal.Select() End If
IsSelectionPatternAvailableがTrueだったら、子要素のIsSelectionItemPatternをSelectするし、IsSelectionItemPatternAvailableがTrueだったらそのままSelectするみたいな感じ。
これで、ComboBox・ListView・RadioButtonは共通的に項目選択ができるハズ。
3.本日の成果物
1.UIA_cmd.exeをWinActor.exeと同じフォルダに配置。
2.「スクリプト実行ノード張り付け用.txt」をスクリプト実行ノードに張り付け。
今回の更新で、操作の内容にGetToggle,SetToggleと、GetSelectionItemIsSelected,SetSelectionItemValueが追加されました。
今度は、このUIAutomationをVBSめーかーからキックできる様にしてみよう。