投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/12/26 17:56:29
> こちらだと、全部の数を確認するときにループで回さないといけないので
> 効率悪いかなと思いました。
通信回数的にも、FindAll / FindFirst による検索の方が効率的ですね。
https://learn.microsoft.com/ja-jp/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtreewalker


> この構文はuiAuto.CreatePropertyConditionと関係するのでしょうか?
はい、関係します。
検索条件はすべて「IUIAutmationCondition インターフェイス」を通じて行われます。


IUIAutomationCondition 自体は、プロパティやメソッドを一切保有していませんが、
継承先のインターフェイスによって、いくつかのメンバーが追加されます。

継承関係は下記の通り。

IUIAutmationCondition
├IUIAutomationBoolCondition
├IUIAutomationNotCondition
├IUIAutomationAndCondition
├IUIAutomationOrCondition
└IUIAutomationPropertyCondition



CreatePropertyCondition メソッドは既にご存じのはずなので、
まずは、IUIAutomationBoolCondition からみていきましょう。
これは ReadOnly な「Property BooleanValue As Long」だけを持ちます。


Dim ac As IUIAutomationCondition '検索条件を表すインターフェイス 

Dim ua As CUIAutomation
Set ua = New CUIAutomation

Dim bc0 As IUIAutomationBoolCondition
Set bc0 = ua.CreateFalseCondition()  'FALSE 条件を生成 
'Set ac = bc0 
Debug.Print bc0.BooleanValue  '「0」 

Dim bc1 As IUIAutomationBoolCondition
Set bc1 = ua.CreateTrueCondition()  'TRUE 条件を生成 
'Set ac = bc1 
Debug.Print bc1.BooleanValue  '「1」 



予想がついていると思いますが、これらは
「If False Then」や「If True Then」な条件に相当します。


次に、IUIAutomationNotCondition 。
その名が示すように、反転のための Not 処理であり、
こちらは「Function GetChild() As IUIAutomationCondition」だけを持ちます。

このインターフェイスは、CreateNotCondition メソッドによって生成されます。

Dim nc0 As IUIAutomationNotCondition
Set nc0 = ua.CreateNotCondition(bc0)
Set nc0 = ua.CreateNotCondition(bc1)
'Set ac = nc0 
'Set ac = nc0.GetChild() 



ここまでくれば、IUIAutomationOrCondition と IUIAutomationAndCondition の働きも分かりますね。
複数の条件を AND/OR 演算で繋ぐためのものです。

Dim ac0 As IUIAutomationAndCondition
Dim oc0 As IUIAutomationOrCondition
Set ac0 = ua.CreateAndCondition(bc0, bc1)
Set oc0 = ua.CreateOrCondition(bc0, bc1)


Create{And|Or}Condition メソッドは 2 つの条件を繋ぎます。
これを繰り返せばより多くの条件を繋げることができますが、代わりに
Create{And|Or}ConditionFromArray メソッドを使うこともできます。
Create{And|Or}ConditionFromNativeArray については、おそらく使うことはないでしょう。


最後は本題の IUIAutomationPropertyCondition インターフェイス。
こちらはよくご存じでしょうから、説明するまでも無いでしょう。

Dim pc0 As IUIAutomationPropertyCondition
Set pc0 = ua.CreatePropertyCondition(Id, Value)
'Set pc0 = ua.CreatePropertyConditionEx(Id, Value, Flags) 
'Set ac = pc0 
Debug.Print pc0.PropertyId
Debug.Print pc0.PropertyValue
Debug.Print pc0.PropertyConditionFlags



CreatePropertyCondition メソッドもしくは
CreatePropertyConditionEx メソッドで生成します。Ex 版を使うと、
部分文字列での検索や、大文字小文字を無視した検索ができます。

これを先の NOT / AND / OR と組み合わせれば、より複雑な問い合わせにも対応できますね。