- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想构建一个应用程序中存在的 UI 元素树。我正在尝试使用 Microsoft UI 自动化。我可以通过访问 AutomationElement.RootElement 来访问桌面,但我不确定如何访问在桌面上运行的应用程序。
主要目标是构建已在桌面上运行的目标应用程序的 UI 树。我无权访问目标应用程序的代码。
当我尝试运行时
foreach (var item in AutomationElement.RootElement.CachedChildren)
{
Console.WriteLine(item.ToString());
}
它给我 fatal error :无法获取未缓存的属性或元素。
请提出解决此问题的最佳方法。
最佳答案
您正在尝试使用 UIA 的缓存功能,该功能允许您缓存 AutomationElements
及其属性并在访问它们时提高性能。这是一个显然与您的问题无关的高级功能,因为您首先需要从 UI 树中实际获取 AutomationElements
。
此外,您的代码即使有效,也不会返回所有树,只会返回桌面的子元素(在 UIA 中,“子元素”实际上是指在特定元素下仅找到一个层次结构的元素)。为了在 UI 树上导航,您需要使用 TreeWalker
类。 MSDN 上有关于它的相当不错的文档,所以我建议您在开始使用它之前先去那里。
请注意,如果您想映射自己的应用程序而不是整个 UI 树,则需要使用将返回应用程序主窗口的条件实例化 TreeWalker
对象。
最后一点 - 在 AutomationElement
上调用 ToString()
不会返回任何特别感兴趣的内容。如果您想获取控件的名称或任何其他属性,您需要使用 GetCurrentPropertyValue
方法(或访问 Current.{PropertyName}
)。
关于c# - 如何遍历一个程序的所有子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16945558/
我是一名优秀的程序员,十分优秀!