2011-08-30 33 views
5

我在窗体上有一个TreeView控件,我递归地浏览窗口本身开始的另一个窗口的元素。我正在使用它来查找元素:Windows用户界面自动化不显示所有子元素?

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

    foreach (AutomationElement child in children) 
    { 
    addToTreeView(child); 
    getRecursiveElements(child); 
    } 
} 

一般而言,代码在大多数情况下工作得很好。树被填充,我有一些其他支持代码允许我双击,例如树视图中的一个元素,它会突出显示目标表单上的元素。

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

这有什么可能的原因,有什么办法可以解决吗? 如果我从user32.dll中调用EnumChildWindows()会有同样的问题吗?

+2

你可以举一些它正在跳过的元素类型的例子吗?您是否将您的树与SDK中的UISpy或Inspect工具生成的树相比较? UIA确实有一个'views'的概念,它是一个除了提供给Find的条件外还应用的过滤器。默认情况下,UIA会过滤掉不是内容元素的东西,因此如果枚举列表框或列表视图,则只会显示列表框,但不会显示滚动条或标题。这是你错过的东西,还是其他的东西? – BrendanMcK

回答

3

并非所有程序都为其所有逻辑子项使用单独的窗口控件。大多数情况下,这取决于所使用的GUI框架。

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

采用此方法的程序通常不可能通过泛型方法自动化。

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

+1

对于OP:我仍然想要一个失败的例子:不使用HWND的应用程序应该实现MSAA或UIAutomation,以便残障用户可以访问它们 - 并且最终可以测试/自动化。例如,WPF,Silverlight和Flash以及IE和Firefox的文档区域不使用HWND作为它们的子元素,但是由于它们实现了这些接口,所以仍然可以使用UIA枚举它们。我想知道“某些目标计划”是什么,因为他们可能还有无障碍问题;我很好奇,如果这些是知名的应用程序。 – BrendanMcK

+2

(FWIW,QT显然实现了MSAA - 即使它只使用一个HWND,它仍然可以使用UIA进行枚举 - 因为UIA在内部使用MSAA作为信息源。无论UI是否可与UIA一起枚举都比简单是否使用HWNDs作为子元素;它还取决于该框架是否具有可访问性支持,以及是否具有该应用程序的开发人员是否已正确使用它。) – BrendanMcK

0

你能举出一个更好的例子吗?考虑到这个问题,可能是因为其他表单中的'元素'是手动绘制的,因此没有明确的注册处理。

相关问题