0

私のテスト アプリケーションでは、常にフォームを開いたり開いたりしています。フォームが開かれるたびに、フォーム上のすべての要素を取得して、要素をAutomationElementCollection操作できるようにする必要があります。ただし、これらの要素を繰り返し取得するのはコストがかかるようです (ツリー ナビゲーション/コンテキスト スイッチなどのため)。

要素を取得するメソッドの周りにブール値を設定しようとしました。メソッドが初めて呼び出された場合、メソッドは正常に実行され、ブール値が true に設定されます。メソッドが 2 回目に呼び出された場合、配列は既に設定されているため、何もしません。

ただしAutomationElement、配列内の任意の操作を (2 回目) 実行しようとすると、要素が使用できないようです。フォームを閉じると、これらの要素が何らかの形で「無効」になりますか? フォームを開くたびにこれらの要素を見つけて、「新鮮」にする必要がありますか?

私は方法を見ましたCacheRequestが、それは要素ではなく、プロパティ/パターンへのアクセスにのみ関係しているようです。

コード/エラーメッセージは次のとおりです。

AutomationElement GAP;
AutomationElementcollection GAP1;
private bool initGAP1 = false;
    public void initGAP()
    {
        if (!initGAP1)
        {
            int refnum = ...;
            int refnum2 = ...;
            AutomationElementCollection temp = MMChildren[refnum].FindAll(TreeScope.Children, findCondition);
            GAP = temp.FindAll(TreeScope.Children, findCondition)[refnum2];
            GAP1 = GAP.FindAll(TreeScope.Children, findCondition); //this contains the elements I want to operate on
            initGAP1 = true;
        }
    }

System.Windows.Automation.ElementNotEnabledException: タイプ 'System.Windows.Automation.ElementNotEnabledException' の例外がスローされました。

4

1 に答える 1

2

新しいウィンドウごとに自動化要素を再取得する必要があります。UIオートメーションフレームワークを理解しているので、実行中のウィンドウを調査する手段を提供します。ターゲットアプリケーションが使用するフレームワークの種類に応じて、さまざまな手法で情報を収集します。あなたの場合、ウィンドウのインスタンスを作成および破棄すると、それらは異なるウィンドウであるため、異なるAutomationElementsとして扱われます(基本的に、OSでは異なるウィンドウハンドルがあります)。基盤となる制御コードが同じであっても、それらはOSに対して異なるインスタンスであるため、UIオートメーションです。

トラバージョンのパフォーマンスに問題がある場合は、代わりにUI Automation COM APIを使用することを検討する価値があります。これは、一部の操作で非常に高速です。

于 2012-04-01T20:32:11.257 に答える