多くのログ メッセージを含むアプリケーション ウィンドウで作業しています。それらをフィルタリングして、何らかの条件に一致するものだけを取得する必要があります。それらすべてをトラバースするという私の選択はTreeWalker、後で大量のメッセージをフィルタリングするのAutomationElement.GetAll()はコストがかかりすぎるためです (何千ものメッセージがある可能性があります)。
List<AutomationElement> messages = new List<AutomationElement>();
TreeWalker walker = new TreeWalker(new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem));
AutomationElement row = walker.GetFirstChild(parentDatagrid);
while (row != null)
{
if (/*some condition*/)
messages.Add(row);
row = walker.GetNextSibling(row);
}
これは、私がテストしているコントロール階層の UISpy ビューです。

予期せずmessages、長さが実際のログ メッセージ数よりも大きくなっています。追加の自動化要素である UISpy を照会したところ、この要素が別のウィンドウから取得されたことがわかりました (条件にも一致しましたControlTypeProperty = ControlType.DataItem)。さらに、このウィンドウは別のアプリケーションにも属していました。TreeWalkerの範囲で検索を終了し、parentDatagridすべてのデスクトップ階層をトラバースし続けました。
もちろん、datagrid の子要素だけを取得したいと考えていました。このような奇妙なTreeWalker動作の原因は何ですか? 私のコードが間違っているのかもしれませんが、同じ断片を複数回書いたところ、正しく動作しました。