如何遍历程序的所有子元素

时间:2013-06-05 16:48:56

标签: c# automation ui-automation uia

我想构建一个存在于应用程序中的UI元素树。我正在尝试使用Microsoft UI Automation。我可以通过访问AutomationElement.RootElement来访问桌面,但我不确定如何访问桌面上运行的应用程序。

主要目标是构建已在桌面上运行的目标应用程序的UI树。我无权访问目标应用程序的代码。

当我尝试运行时

foreach (var item in AutomationElement.RootElement.CachedChildren)
        {
            Console.WriteLine(item.ToString());
        }

它给了我致命错误:无法获取未缓存的属性或元素。

请建议解决此问题的最佳方法是什么。

1 个答案:

答案 0 :(得分:4)

您正在尝试使用UIA的缓存功能,该功能允许您缓存AutomationElements及其属性,并在访问它们时提高性能。这是一个与您的问题显然无关的高级功能,因为您首先需要从UI树中实际获取AutomationElements

此外,您的代码即使有效,也不会返回所有树,只是桌面的子元素(在UIA中,“子元素”实际上是指在特定元素下只找到一个层次结构的元素)。要在UI树上导航,您需要使用TreeWalker类。在MSDN上有相当好的文档,所以我建议你先开始使用它。

请注意,如果要映射自己的应用程序而不是整个UI树,则需要使用条件实例化TreeWalker对象,该条件将返回应用程序的主窗口。

最后一点注意事项 - 在ToString()上调用AutomationElement不会返回任何特别感兴趣的内容。如果您想获取控件或任何其他属性的名称,您将需要使用GetCurrentPropertyValue方法(或访问Current.{PropertyName})。