9

Inspectツールで特定のAutomationIDを持つ要素に子があることがわかります。

スクリーンショットを調べる

しかし、私がこのようにそれらを取得しようとすると:

AutomationElement aPane = mainWindow.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.AutomationIdProperty, "8264"));
AutomationElementCollection theChildren = aPane.FindAll(TreeScope.Subtree, Condition.TrueCondition);

aPane要素は正しく取得されますが、要素theChildrenは空です。何がうまくいかなかったのか?

4

6 に答える 6

14

まれに、Find*呼び出しですべてのオートメーション オブジェクトが見つからないことがわかりました。私がこれで見た唯一の一貫したケースは、WPFTextBlockコントロールがデータ テンプレート内にある場合、それらの呼び出しでは見つからないということです。このような場合、RawViewWalkerおそらく Inspect が内部で行っていることに近い を試すことができます。

public static IEnumerable<AutomationElement> FindInRawView(this AutomationElement root)
{
    TreeWalker rawViewWalker = TreeWalker.RawViewWalker;
    Queue<AutomationElement> queue = new Queue<AutomationElement>();
    queue.Enqueue(root);
    while (queue.Count > 0)
    {
       var element = queue.Dequeue();
       yield return element;

       var sibling = rawViewWalker.GetNextSibling(element);
       if (sibling != null)
       {
          queue.Enqueue(sibling);
       }

       var child = rawViewWalker.GetFirstChild(element);
       if (child != null)
       {
          queue.Enqueue(child);
       }
    }
}
于 2013-01-06T22:45:45.927 に答える
1

マネージド UI オートメーションとアンマネージド UI オートメーションの違いは、マネージドが古い実装を使用しているのに対し、Inspect は COM を直接使用しており、これは新しいバージョン 3.0 であるためです。

于 2015-03-31T13:24:17.200 に答える
1

実際の問題は、マネージドコードで同じ結果を達成しようとしているときに、Inspect.exe がアンマネージドコードで記述されていることです。アンマネージ コードは、マネージ バージョンとはわずかに異なる結果を返します (たとえば、マネージ コードはコントロール タイプのドキュメントを返しますが、アンマネージ コードはアプリケーションでeditを返します)。

理解するのに少し時間がかかりましたが、アンマネージ コードははるかに高速で正確であるため、信頼性が高くなります。

C# のアンマネージ UI オートメーション コードの例は、Microsoft Windows UI オートメーション ブログ (例:ここ) にあります。

于 2015-02-01T16:49:21.750 に答える