WinActorで無理やりUIAutomation制御する企画。
前回までで、NameでもAutomationIDでも取得できないコントロールをNextとPreviousで無理やり取得できる様にした。
前回までのSetValueとGetValueだと、ComboBoxとListViewに対応できていなかったのでそちらへの対応について今日は検討していきます。
1.ComboBoxコントロール
まず、コンボボックスコントロールは項目が直接編集可能なケースとリスト選択のみのケースがある。
内部的に、直接編集の有効無効の状況によってアクセスできるかどうかが変わってくるみたいだ。
直接編集が有効なコンボボックスであれば、前回までのGetValueで選択内容のラベルが取得できる。
直接編集が無効な場合には、リストアイテムの選択状況を取得しなければならないようだ。
2.ListViewコントロール
コンボボックスで直接編集不可のケースと同じ概念でリストアイテムの取得・選択をしなければならない。
さてさて、リストアイテムの取得・選択制御について試していきましょー。
3.選択された項目の取得
ターゲットになる項目からSelectionPatternを取得して、そっからGetSelectionすると選択状態になっているAutomationElementが取得できるので、その名前をカンマ区切りで出力してます。
Dim SlctPtn As SelectionPattern = TargetElm.GetCurrentPattern(SelectionPattern.Pattern) Dim SelectLabel As String = "" For Each SlctItm As AutomationElement In SlctPtn.Current.GetSelection() If (Len(SelectLabel) > 0) Then SelectLabel = SelectLabel & "," SelectLabel = SelectLabel & SlctItm.GetCurrentPropertyValue(AutomationElement.NameProperty).ToString() Next Console.WriteLine(SelectLabel)
4.項目の選択(単一選択)
Multipleの選択はちょっと力尽きたので・・・いつか必要になった時に。
ターゲットになる項目からSubtreeで特定の名前のSelectionItemPattern要素を検索取得して、Select()してます。
複数選択可の場合は、AddToSelection()するといいみたい。
Dim itemElm As AutomationElement = TargetElm.FindFirst(TreeScope.Subtree, New PropertyCondition(AutomationElement.NameProperty, argVal)) Dim ptnVal As SelectionItemPattern = itemElm.GetCurrentPattern(SelectionItemPattern.Pattern) ptnVal.Select()
5.資材と実装
1.UIA_cmd.exeをWinActor.exeと同じフォルダに配置。
2.「スクリプト実行ノード張り付け用.txt」をスクリプト実行ノードに張り付け。
今回の更新で、操作の内容にGetSelection、SetSelectionItemValueが追加されました。
次は、チェックボックスへの対応ですねぃ。。。