投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/12/29 15:23:21
環境依存性の高いコードになっているので、
どの階層の話をしているのか、正直、状況が見えてきません…。

手元の環境では、Edge を起動しても、あるいはそこで MSN を開いても、
 「"新しいタブ" で始まる Name」が存在しませんでした。(この辺りは設定依存)

なので、その子孫の「"View"という ClassName」の要素が
何を示しているのか検討が付きませんでした。


> それをinspect.exeにて参照すると、
Inspact のような一括フェッチが必要な場合はキャッシュを使用します。
https://learn.microsoft.com/ja-jp/windows/win32/winauto/uiauto-cachingforclients

※TreeScope_Parent / TreeScope_Ancestors は使用できないので、
 親階層を辿りたいような場合にもキャッシュが必要になってきます。


> Set uiCnd = uiAuto.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_WindowControlTypeId)
> Set aryElm = elmDesktop.FindAll(TreeScope_Subtree, uiCnd)

デスクトップからこの条件だけで Subtree を絞り込むのは、若干大雑把過ぎませんか?
今回は Inspect の調査ということで、あえてそうしているのかもしれませんが、
仮に、Edge 本体を捕らえることが目的なのであれば
 ・ClassName が "Chrome_WidgetWin_1" と一致
 ・ControlType が UIA_WindowControlTypeId と一致
 ・Name の末尾が "- Microsoft" & ChrW(&H200B) & " Edge"
という AND 条件で絞り込めます。
末尾検索はできないので、そこはループで If 判定が必要ですけれどね。

Edge や Chrome は、どのタブがアクティブになっているのかどうかで、
Chrome_RenderWidgetHostHWND などの階層が動的に変化する点にも注意。
https://twitter.com/benshi_orator/status/1396770128012791818?lang=ja



> Set elmMSN = elmMSN.FindFirst(TreeScope_Children, uiCnd)
> elmMSN is nothing  が trueになってしまいます。
この手の検証時には、elmMSN 変数を使いまわさず、別変数に Set した方が良いでしょう。

また、今回は子孫探索という大雑把な絞り込みをしているので、
elmEdge や FindFirst 前の elmMSN で受け取った要素が
inspect.exe で表示しているものと同じものであるかどうか、
RuntimeId を比較検査した方が良いかもしれません。
※逆に UIA_RuntimeIdPropertyId 条件で絞り込むという手もあり。

rid = ""
For Each x In elmEdge.GetRuntimeId()
    rid = rid & (" " & Hex(x))
Next
rid = Replace(Trim(rid), " "".")
Debug.Print rid



> 最終的には、ブラウザのテキスト拾ったり、クリックしたりができればよいです。
ブラウザーによっては、 Accessibility の設定変更が必要になるケースがあるようです。
Edge の場合は、アドレスバーに「edge://accessibility/」を入力します。
Chrome だと「chrome://accessibility/」ですね。

https://knowledge.bizrobo.com/hc/ja/articles/4402840941197