AutomaitonElementって何?

 MSDNソースコードを読んだり、プロトタイプを作って動作を確認してみたりを繰り返した結果、以下のようなモノだと理解しています。

 

①「ウィンドウ」とは別の画面要素を識別可能な単位

②「AutomationElement」として、外形等の一部情報が取得できる

③WinForms、WPF、UWP が AutomationElement に対応している

④コントロールパターンという形で操作の実現ができる

 

 今回は、上記における①~③を確認することを目標とします。

 説明するより動作を見た方が早いと思いますので、コードをGitHubにアップしました。コードをダウンロードしてVisualStudioでビルドすれば動作するものが出来ます。

 

 https://github.com/hatarabo/automation-spy

 

 起動直後はこのような画面です。

 AutomaitonElement と Window Handle での画面要素を識別する単位が違うことを確認できるよう、識別方法を選択できるようにしています。

 選択方法を選択し、開始ボタンを押下すると識別機能が開始されます。

 任意のウィンドウ上等でマウスの左クリックを押すと、対象を識別します。

f:id:hatarabo:20200614192146p:plain

 

 挙動の違いをUWPアプリの電卓で確認してみます。

 Window Handle の場合、電卓アプリ識別できますが、その中のボタンは識別できません。

f:id:hatarabo:20200614193612p:plain

 

 Automation Element の場合、電卓アプリの中のボタン単位で識別できます。

 また、当該ボタンの一部情報(たとえば、IsEnable = True)が取得できます。このサンプルでは PropertyGrid.SelectedObjects に AutomationElement.Current を設定するようにしています。

f:id:hatarabo:20200614193822p:plain

 

 簡単にではありますが、AutomationElement と Windows Handle の違いがご確認いただけたかと思います。

 そして、AutomationElementの最大のポイントは「対象パスで指定できる」という点です。HTML要素を id 等の属性値で特定できる、と同等のことが可能です。この特性が「WindowsOS上で一意の画面要素の位置を特定する」ことに、とても有益です。

 

 

(※1)

 AutomationElementで識別できるか否かは「対象が AutomationElementとのインターフェースに対応しているか」に依ります。たとえば Chromeブラウザは、WindowHandleでは識別できますがAutomationElement では識別できません。

 とはいえ、WinForms、WPF、UWPの開発で利用する基底クラスがAutomationElementに対応しているので、大半のアプリケーションには対応可能だと思います。