System.Windows.Automation 非常慢

2024-05-19

System.Windows.Automation 非常慢。

我执行:

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

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

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

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


System.Windows.Automation非常slow.

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

除此之外,实施是不是线程安全的.

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

In the MSDN https://msdn.microsoft.com/en-us/library/windows/desktop/ee684076(v=vs.85).aspx你会发现以下注释:

UI 自动化首先在 Windows XP 中作为 微软.NET框架。尽管非托管 C++ API 也是 当时发布,客户端功能的用处有限 因为互操作性问题。对于 Windows 7,API 已 在组件对象模型 (COM) 中重写。 虽然早期版本引入的库函数 UI 自动化仍然有记录,它们不应该在新的中使用 应用程序。

性能缓慢的解决方案是使用新的IUI自动化元件COM 接口而不是旧的 System.Windows.Automation C# 接口。之后代码将运行快如闪电!

除此之外,新界面提供了更多模式,并且微软正在不断扩展它。在 Windows 10 SDK(UIAutomationClient.h 和 UIAutomationCore.h)中添加了 .NET 自动化框架中不可用的多个模式和属性。

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

  • IUIAutomationLegacyIAccessiblePattern
  • IUI自动化对象模型模式
  • IUI自动化注释模式
  • IUIAutomationTextPattern2
  • IUI自动化样式模式
  • IUI自动化电子表格模式
  • IUIAutomationSpreadsheetItemPattern
  • IUIAutomationTransformPattern2
  • IUIAutomationTextChildPattern
  • IUI自动化DragPattern
  • IUI自动化DropTargetPattern
  • IUI自动化文本编辑模式
  • IUI自动化自定义导航模式

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

  • AppBar
  • 语义缩放

此外还添加了以下元素:

  • IUI自动化元素2
  • IUIAutomationElement 3
  • IUIAutomationElement 4

以及什么问题bugs:新的 COM UIAutomation 框架设计得非常好,我在上面找不到错误客户端相比之下,这个框架是一个很大的进步System.Windows.Automation。但一些缺失的功能甚至是错误服务器端框架的。在服务器端,每个 GUI 框架必须实现一个 UIAutomation 提供程序(请参阅MSDN:提供商接口 https://msdn.microsoft.com/en-us/library/windows/desktop/ee671301%28v=vs.85%29.aspx)。因此,这些问题会根据您要自动化的应用程序类型而有所不同,因为每个 GUI 框架都有自己的问题:

In the 本机 Windows 图形用户界面缺少功能:许多控件没有实现它们应该实现的模式。例如一个分割按钮在本机工具栏中应该实现Invoke模式来单击按钮和ExpandCollapse模式来打开下拉菜单。但是ExpandCollapse缺少模式,这使得使用 SplitButtons 变得困难。如果您通过以下方式获得工具栏 SplitButtonIUIAutomation->ElementFromPoint()然后询问它的父元素,您将得到一个残缺的元素。还有Pager控制根本无法自动化。

Also in WPF应用程序有些控件是由 Microsoft 实现的有缺陷:例如,如果您有一个Calendar您可以在顶部看到两个按钮来切换到下个月/上个月。如果您执行Invoke这些按钮上的图案你会得到一个UIA_E_NOTSUPPORTED错误。但这不是框架客户端的错误,因为对于其他按钮Invoke模式工作正常。这是 WPF 自动化服务器中的一个错误。如果你测试IUIAutomationTextRange使用WPF RichTextBox,你会发现有几个命令没有实现:Select() and ScrollIntoView()什么都不做。

For .NET 表单应用程序微软并没有做出太多努力来支持他们。互联网Calendar控制根本无法自动化。整个控件甚至不被识别为日历。它具有 ControlType“Pane”,其中没有子元素。这同样适用于日期时间选择器。对于复杂的控制,例如DataGrid and 属性网格唯一实现的模式是LegacyIAccessible这是一个很差的支持。这些控制措施应至少实施TableGridScrollItem图案。

Also IE浏览器无法自动化,因为可见区域之外的元素由于缺少坐标而无法自动滚动到视图中。 (边界作为空矩形返回)并且ScrollItem模式未实施。 (是的,我知道 Internet Explorer 在 Windows 10 中已被 Edge 取代,但 UIAutomation 框架自 Windows 7 以来就存在,并且微软这些年来没有在 Internet Explorer 中实现有用的自动化支持)

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

Summary:我们有一个很棒的框架,但实用性有限。开发新的 UIAutomation 框架的 Microsoft 团队做得很好,但 Microsoft 的其他领域(本机 GUI、WPF、.NET 和 Internet Explorer 团队)不支持该框架。这是非常可悲的,因为只需要付出一点努力就能提供更好的功能。但似乎最初使用 UIAutomation 的用户(残疾人)并不是一个有利可图的市场。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.Windows.Automation 非常慢 的相关文章

  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • 如何在 Windows 窗体中运行屏幕保护程序作为其背景?

    如何在 Windows 窗体中运行屏幕保护程序作为其背景 用户还可以在屏幕保护程序运行时与表单控件进行交互 为什么这个 我们有一个案例 需要在用户时运行 Windows Bubbles 屏幕保护程序 可以继续与表单控件交互吗 您可以使用以下
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • Dynamics Crm:获取状态代码/状态代码映射的元数据

    在 Dynamics CRM 2011 中 在事件实体上 状态原因 选项集 也称为状态代码 与 状态 选项集 也称为状态代码 相关 例如看这个截图 当我使用 API 检索状态原因选项集时 如下所示 RetrieveAttributeRequ
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • 在不同的捆绑包上测试 iPhone 应用内购买?

    我们有一组 iPhone 应用程序的 Beta 测试人员 最近 我们在应用程序中添加了应用内购买功能 在此之前 我们会使用单独的捆绑 ID 和名称向 Beta 测试人员发送临时版本 以便他们可以在手机上拥有商店版本和临时版本 然而 似乎我们
  • 在c#中映射两个类

    我有两节课 public class foo1 public int id public string image link public string sale price and public class foo2 public int
  • 分布式模式下的 JMeter 摘要报告

    我正在分布式模式 2个从站 主站 下运行Jmeter性能测试 在我的测试脚本中我配置了摘要 报告应将一些数据保存到 csv 文件 此文件位置配置有固定名称 reports summary csv 值 当我从主站成功连接到两个从站时 测试在从
  • OpenCV:如何从网络摄像头获取原始 YUY2 图像?

    你知道如何获得吗raw YUY2来自网络摄像头的图像 使用 OpenCV DirectShow 无 VFW http opencv willowgarage com wiki CameraCapture http opencv willow
  • 如何设置透明叠加 WMS 图层的样式

    我成功了覆盖WMS层 http blog sumbera com 2010 11 02 tiled wms overlay on google map v3 然而 在谷歌地图v3中 由于图块上的信息是透明的黑色 因此在深色背景 如卫星地图
  • php基于onclick函数输入日期类型

    用户选择日期 月份和年份 然后按一个按钮 根据他选择的日期向他显示数据库的值 不知道代码问题出在哪里
  • JDBC 错误:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我在 Java Eclipse 中收到错误消息 我在 MySql 中有一个数据库 它有列 String user name int id time int id desk int user password 我想
  • LuaJ 导入 Lua 方法

    我正在使用 LuaJ 并且我有一个 lua文件充满了一堆函数 如何通过 LuaJ 导入这些函数以在 Java 中使用 一种选择是将文件编译为 Java 代码并导入它 另一种方法是使用可嵌入解释器直接从 Java 代码中调用 Lua 文件 E
  • 如何解决 Socket.io 404(未找到)错误?

    我正在使用 Socket io 和 Express 在我的项目中 我有一个登录页面和一个主页 当我成功登录时 我导航到 localhost 3000 home 并收到以下错误 GET http localhost 3000 socket i
  • 在应用程序简历中隐藏软键盘

    我有一个 Android 应用程序 使用 Xamarin 用 C 编写 我已将应用程序简化为包含 TextView 和用于横幅广告的 Google admod AdView 的 LinearLayout 我不希望软键盘出现在应用程序中 这不
  • 处理与不同相关实体的一对多的正确模式

    我有一个 C 项目 我使用实体框架作为 ORM 我有一个User 可以向多家银行付款 每家银行都是一个独立的实体 并且每家银行都由不同的字段描述 问题是 一User可以没有或有很多不同的Banks 我不太确定如何对此进行建模 临时解决方案是
  • pymongo.errors.BulkWriteError:发生批量操作错误(MongoDB 3.4.2、pymongo 3.4.0、python 2.7.13)

    我正在迁移数亿条该格式的推文 id str created at text 使用 pymongo 将文本文件转换为 MongoDB 为每个用户创建一个集合来存储他 她的推文 我使用的插入方法是insert many 常常会遇到BulkWri
  • 将数组字段组合成单个数组字段 mongo

    我正在使用 mongo 版本 3 4 3 我的文档存储在 mongo 中 如下所示 id ObjectId 5ad5ab8aaf2808b739ba6ab2 ResumeId 105839064 ResumeDetails WorkProf
  • 从命令提示符/批处理文件添加环境变量

    我正在尝试在批处理文件中添加环境变量 系统 以下命令显示错误 语法无效 有人可以帮忙吗 对我来说它看起来不错 reg add HKLM SYSTEM CurrentControlSet Control Session Manager Env
  • 在应用 varImp 函数时使用带插入符号的 xgbTree 方法和目标变量的权重时出现非树模型错误

    当我使用 Caret 包中的 train 函数创建模型以使用权重进行梯度提升时 在使用 varImp 函数时出现错误 表示它没有检测到树模型 但当我去掉重量时它就起作用了 下面的代码产生错误 set seed 123 model weigh
  • 在 Ubuntu 18.04 上安装 Docker? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我检查了 Ubuntu 上 Docker 的文档页面 没有看到最近发布的 18 04 https docs docker com inst
  • 动态添加案例到交换机

    我需要动态地将案例添加到交换机 我希望用户能够添加项目 并且每个项目都需要它自己的开关盒 您可以使用带有回调函数的对象 You can have initial cases var callbacks something gt 42 and
  • 为什么 EF Core 使用此存储过程总是返回 -1?

    我正在尝试对本地 2016 DB 使用 EF Core 最新版本 并且我得到 1每次都回来 我不知道我做错了什么 我知道它正在到达数据库 我查了一下 int returnCode dbContext Database ExecuteSqlC
  • Git 在哪里存储标签?

    Git 在哪里存储标签 我执行 git tag v0 1 0 v0 10 0 v0 11 0 但目录 git refs tags是空的 Git 将这些标签存储在哪里 谢谢 它们也可以存储在 git packed refs
  • System.Windows.Automation 非常慢

    System Windows Automation 非常慢 我执行 element FindAll TreeScope Children Condition TrueCondition 在速度非常快的计算机上 仅获取 30 个子元素可能需要