AutomaitonElementって何?
MSDN のソースコードを読んだり、プロトタイプを作って動作を確認してみたりを繰り返した結果、以下のようなモノだと理解しています。
①「ウィンドウ」とは別の画面要素を識別可能な単位
②「AutomationElement」として、外形等の一部情報が取得できる
③WinForms、WPF、UWP が AutomationElement に対応している
④コントロールパターンという形で操作の実現ができる
今回は、上記における①~③を確認することを目標とします。
説明するより動作を見た方が早いと思いますので、コードをGitHubにアップしました。コードをダウンロードしてVisualStudioでビルドすれば動作するものが出来ます。
https://github.com/hatarabo/automation-spy
起動直後はこのような画面です。
AutomaitonElement と Window Handle での画面要素を識別する単位が違うことを確認できるよう、識別方法を選択できるようにしています。
選択方法を選択し、開始ボタンを押下すると識別機能が開始されます。
任意のウィンドウ上等でマウスの左クリックを押すと、対象を識別します。
挙動の違いをUWPアプリの電卓で確認してみます。
Window Handle の場合、電卓アプリ識別できますが、その中のボタンは識別できません。
Automation Element の場合、電卓アプリの中のボタン単位で識別できます。
また、当該ボタンの一部情報(たとえば、IsEnable = True)が取得できます。このサンプルでは PropertyGrid.SelectedObjects に AutomationElement.Current を設定するようにしています。
簡単にではありますが、AutomationElement と Windows Handle の違いがご確認いただけたかと思います。
そして、AutomationElementの最大のポイントは「対象パスで指定できる」という点です。HTML要素を id 等の属性値で特定できる、と同等のことが可能です。この特性が「WindowsOS上で一意の画面要素の位置を特定する」ことに、とても有益です。
(※1)
AutomationElementで識別できるか否かは「対象が AutomationElementとのインターフェースに対応しているか」に依ります。たとえば Chromeブラウザは、WindowHandleでは識別できますがAutomationElement では識別できません。
とはいえ、WinForms、WPF、UWPの開発で利用する基底クラスがAutomationElementに対応しているので、大半のアプリケーションには対応可能だと思います。