特定のプログラムのすべてのコントロールを列挙するために、アクティブアクセシビリティフレームワークを使用しています。問題は、コントロールのツリーをトラバースすると、エクスプローラーやビジュアルスタジオなどの複雑なアプリケーションで永遠にかかることです。単純なアプリケーションには約1秒かかりますが、多くのコントロールを備えた大きなアプリケーションには10秒かかる場合があります。誰もがこれを経験しますか?また、プロセス内とプロセス外でMSAAを使用することへの言及もいくつか見つかりました。これは何を意味するのでしょうか?
1 に答える
まず第一に、再帰的にトラバースするときは注意してください。「ツリー」に「サイクル」が存在することがあり、オブジェクトを確実に比較して、このオブジェクトに既に行ったかどうかを確認することはできません...
Active Accessibility が非常に遅い主な理由は、再帰的にトラバースされるとは考えられておらず、1 つの要素 (カーソルの下) またはその子に関する詳細を表示するためだけにあるためです。すべての AA 要求 (すべてのプロパティに対する) は、コンテキストをターゲット アプリケーションに切り替えてから戻す必要があります。そして、AA を正しく実行している場合 (すべての UI オブジェクトに多くの説明が添付されている場合)、通過するのに時間がかかる数千のオブジェクトがあります...
何か特定のものを探している場合は、すべてのコントロールをトラバースするよりも、直接リクエストする方が簡単かもしれません。または、既知の他のプロパティを持つ HWND にのみ表示されるある種のオブジェクトのみを探している場合は、最初にすべての HWND を列挙してから呼び出す方がはるかに高速ですAccessibleObjectFromWindow
(これはトップレベル ウィンドウだけでなく、子ウィンドウの場合)。子を列挙するときは、HWND プロパティが変更されるとすぐに停止できます。
そして、これらのサイクルのいずれかに遭遇しないように、再帰の深さにいくつかのハード最大カウンターを追加します。