gpt4 book ai didi

c# - System.Windows.Automation非常慢

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:15 24 4
gpt4 key购买 nike

System.Windows.Automation非常慢。

我执行:

element.FindAll(TreeScope.Children, Condition.TrueCondition);


在非常快的计算机上,仅获取30个子元素可能需要1000毫秒。

我什至看到它在QT应用程序中获取Tree的子元素时永久悬挂。

这是一个已知问题吗?
经过大量搜寻后,我找不到任何有用的答案。

最佳答案

System.Windows.Automation非常慢。

System.Windows.Automation充满了错误。它可能不会返回AutomationElement的所有子级,这是一个非常严重的错误。

除此之外,实现不是线程安全的。

System.Windows.Automation已过时。不要使用它!

MSDN中,您可以找到以下注释:


  UI自动化最早是Windows XP中的一部分,
  Microsoft .NET Framework。尽管非托管C ++ API也
  当时发布的客户端功能的作用是有限的
  由于互操作性问题。对于Windows 7,API已
  在组件对象模型(COM)中重写。
   尽管早期版本的库中引入了库功能
  UI Automation仍在文档中,不应在新版本中使用
  应用程序。


降低性能的解决方案是使用新的IUIAutomationElement COM接口,而不是旧的System.Windows.Automation C#接口。之后,代码将以闪电般的速度运行!

除此之外,新界面还提供了更多的模式,Microsoft也在不断扩展它。在Windows 10 SDK(UIAutomationClient.h和UIAutomationCore.h)中,添加了一些模式和属性,这些模式和属性在.NET Automation框架中不可用。

下列模式在UIAutomation的COM版本中可用,在System.Windows.Automation中不存在:


IUI自动化传统IAccessiblePattern
IUIAutomationObjectModelPattern
IUIAutomationAnnotationPattern
IUIAutomationTextPattern2
IUIAutomationStylesPattern
IUIAutomationSpreadsheetPattern
IUIAutomationSpreadsheetItemPattern
IUIAutomationTransformPattern2
IUIAutomationTextChildPattern
IUIAutomationDragPattern
IUIAutomationDropTargetPattern
IUIAutomationTextEditPattern
IUIAutomationCustomNavigationPattern


此外,还添加了以下控件类型:


应用栏
语义缩放


此外,还添加了以下元素:


IUIAutomationElement2
IUIAutomationElement3
IUIAutomationElement4


以及与错误有关的方面:新的COM UIAutomation框架经过精心设计,在框架的客户端上我找不到错误,与System.Windows.Automation相比,这是一个很大的进步。但是框架的服务器端缺少了一些功能,甚至还有一些错误。在服务器端,每个GUI框架都必须实现UIAutomation提供程序(请参见MSDN: Interfaces for Providers)。因此,这些问题取决于您要自动化的应用程序类型,因为每个GUI框架都有其自身的问题:

在本机Windows GUI中,缺少以下功能:许多控件未实现应实现的模式。例如,本机工具栏中的SplitButton应该实现Invoke模式以单击按钮,而实现ExpandCollapse模式以打开下拉菜单。但是缺少ExpandCollapse模式,这使得很难使用SplitButtons。如果通过IUIAutomation->ElementFromPoint()获取工具栏SplitButton,然后要求其为父项,则会出现残缺的元素。而且分页器控件根本无法自动化。

同样在WPF应用程序中,Microsoft实施了一些有问题的控件:例如,如果您有一个Calendar控件,则在顶部会看到两个按钮以切换到下个月/上个月。如果在这些按钮上执行Invoke模式,则会出现UIA_E_NOTSUPPORTED错误。但这不是框架客户端的错误,因为对于其他按钮,Invoke模式可以正常工作。这是WPF自动化服务器中的错误。而且,如果使用WPF RichTextBox测试IUIAutomationTextRange,您会发现未实现几个命令:Select()ScrollIntoView()根本不执行任何操作。

对于.NET Forms应用程序,Microsoft并未付出很多努力来支持它们。 .NET日历控件完全不能自动化。整个控件甚至都无法识别为日历。它具有ControlType“ Pane”,其中没有子元素。对于DateTimePicker也是如此。对于像DataGrid和PropertyGrid这样的复杂控件,唯一实现的模式是LegacyIAccessible,支持不佳。这些控件应至少实现TableGridScrollItem模式。

此外,Internet Explorer也无法自动执行,因为由于缺少坐标,可见区域之外的元素无法自动滚动到视图中。 (将边界作为一个空矩形返回),并且未实现ScrollItem模式。 (是的,我知道Internet Explorer在Windows 10中已被Edge取代,但是UIAutomation框架存在,因为Windows 7和Microsoft多年来一直没有在Internet Explorer中实现有用的自动化支持)

我什至看到了自动化应用程序的完全崩溃。例如,如果您在某个控件上执行某些自动化命令,Visual Studio和TotalCommander将崩溃。这里-再次-该错误在于框架的服务器端实现。

简介:我们有一个有用的有限框架。开发新的UIAutomation框架的Microsoft团队做得很好,但是Microsoft的其他区域(本机GUI,WPF,.NET和Internet Explorer团队)不支持此框架。这是非常可悲的,因为只需付出很小的努力即可提供更好的功能。但是,似乎首先使用UIAutomation的用户(残障人士)不是一个有利可图的市场。

关于c# - System.Windows.Automation非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41768046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com