Windows UI Automation不显示所有子元素?

Ozz*_*zah 5 c# windows ui-automation

我的表单上有一个TreeView控件,我以递归方式从窗口本身开始浏览另一个窗口的元素.我用这个来找到元素:

getRecursiveElements(AutomationElement parent)
{
  children = parent.FindAll(TreeScope.Children, Condition.TrueCondition);

  foreach (AutomationElement child in children)
  {
    addToTreeView(child);
    getRecursiveElements(child);
  }
}
Run Code Online (Sandbox Code Playgroud)

一般来说,代码在大多数情况下都能很好地工作.树被填充,我有一些其他支持代码,允许我双击,例如,树视图中的元素,它将突出显示目标表单上的元素.

我遇到的问题是,虽然它生成了一个很棒的树,但某些目标程序仍然缺少一些元素.

可能有什么理由可以解决这个问题,有什么方法可以解决这个问题吗?如果我EnumChildWindows()从user32.dll 调用会有同样的问题吗?

Dav*_*nan 5

并非所有程序都对其所有逻辑子项使用单独的窗口控件。这主要取决于所使用的 GUI 框架。

作为一个极端的例子,Qt 为每个顶级窗口使用一个窗口。然后它从窗体的 WM_PAINT 消息处理程序中绘制窗体上的所有小部件。

采用这种方法的程序通常不可能通过通用方法实现自动化。

听起来您遇到了一个应用程序,它使用一些窗口控件,但也使用带有单个窗口的自定义控件来显示多个小部件。这也是很常见的。

  • (FWIW,QT 显然实现了 MSAA - 所以即使它只使用单个 HWND,它仍然应该可以使用 UIA 进行枚举 - 因为 UIA 使用 MSAA 作为内部信息源。UI 是否可以使用 UIA 进行枚举比简单地是否可以枚举更复杂它对子元素使用 HWND;它还取决于框架是否具有可访问性支持,如果有,应用程序的开发人员是否正确使用了它。) (2认同)