COM および IHtmlElement を介して Internet Explorer の一部にアクセスできるが、AutomationElements の GUI ツリーを介して (直接) アクセスできないという特定のシナリオがあります。(ツリー/階層を使用して要素を見つける必要があります。また、その特定の Internet Explorer の GUI ツリーが壊れています (カスタマイズによるものなのか、古いバージョンであるためなのかはわかりません。これは当然のことです)。
これで、必要であり、IHtmlElement から取得できない AutomationElement のプロパティがあります (実際、このバージョンの IE の IHtmlElement からプロパティを取得することはできませんが、AutomationElement から取得することはできます)。
私の素朴なアプローチは、単純に IHtmlElement の座標を取得し (offsetParent を介して再帰的に)、AutomationElement.FromPoint(x, y) を使用してそれらを AutomationElement に変換することです。もちろん、これは本当に安定しているわけではありません(ただし、動作は問題ありません)。
ウィンドウ ハンドルを介して変換しようとしましたが、.. HTMLElements は、最も外側の要素のウィンドウ ハンドルしか所有していないようです (そうしないと、Web サイトが多くのハンドルを使い果たすことになると思います)。
IID_IAccessible インターフェイス (メイン ドキュメントを IServiceProvider として使用する場合に機能するようです) を使用して COM オブジェクトを (再び) 取得しようとする「ファンシーな」アプローチをいくつか試しましたが、残念ながら、後で AutomationElement を作成する方法がわかりません。私の IAccessible オブジェクトの ( IHTMLElement -> IAccessibleからのアイデア)。
このアプローチまたは上記の一般的な問題に関するヘルプは大歓迎です!
私のアプローチに関するアイデアを提供するためのいくつかの大まかなコード(ただし、最初に mMainDocument を使用するのではなく、現在の要素を使用する必要があることがわかりましたが、これは ae を null で埋めます):
Guid IID_IAccessible = new Guid("618736E0-3C3D-11CF-810C-00AA00389B71");
IServiceProvider sp = (IServiceProvider)mMainDocument;
Object ae = null;
sp.QueryService(ref IID_IAccessible, ref IID_IAccessible, out ae);
System.Windows.Automation.AutomationElement ae2 = System.Windows.Automation.AutomationElement.FromLocalProvider((System.Windows.Automation.Provider.IRawElementProviderSimple)ae);
// ae is no AutomationElement, and the last line (with ae2) fails