TreeWalker遍历另一个窗口中的控件

时间:2014-02-27 20:41:43

标签: c# ui-automation automationelement

我正在使用包含大量日志消息的应用程序窗口。我需要过滤它们并检索那些只有算数的条件。在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视图。

Screenshot from UISpy

意外messages长度大于实际日志消息的数量。我查询了额外的自动化元素是UISpy,发现这些元素是从另一个窗口检索的(它们也匹配条件ControlTypeProperty = ControlType.DataItem)。而且,这个窗口甚至属于另一个应用程序。 TreeWalkerparentDatagrid范围内完成了搜索,并继续遍历所有桌面层次结构。

当然,我希望只获得datagrid的子元素。什么可能导致这种奇怪的TreeWalker行为?也许,我的代码是错误的,但我写了相同的剪切多次,并且它工作正常。

1 个答案:

答案 0 :(得分:0)

实际上我无法告诉你为什么TreeWalker会这样做,因为我从不使用TreeWalker进行导航。我只是用它来查找父母,孩子,兄弟姐妹等。

我可以告诉你的是,我有很好的使用经验:

List<AutomationElement> messages = new List<AutomationElement>();
AutomationElement parentDatagrid;//your AE

Condition yourCond = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem));
AutomationElementCollection aECollection;
aECollection= parentDatagrid.FindAll(TreeScope.Element | TreeScope.Descendants, yourCond);
foreach (AutomationElement element in aECollection)
{
    //whatever you like
}

当然,如果性能问题,你必须小心使用TreeScope.Descendants。那么你应该考虑使用TreeScope.Children,因为后代会查看直接孩子的所有子元素和子女。

希望这有帮助!