1

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

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

当我尝试跑步时

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

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

请提出解决此问题的最佳方法。

4

1 回答 1

4

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

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

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

最后一点 - 调用ToString()anAutomationElement不会返回任何特别感兴趣的东西。如果要获取控件的名称或任何其他属性,则需要使用GetCurrentPropertyValue方法(或 access Current.{PropertyName})。

于 2013-06-12T07:25:17.240 回答