Windows11下UIAutomation调用GetText抛出AccessViolationException问题
我们基于C#开发了一款应用,通过UIAutomation接口获取Word、OpenOffice、记事本等第三方应用内的当前文本(包含选中文本、光标停留位置的对应词语)。该应用在Windows 10系统(截至检查当日最新21H2版本)上运行完全正常,但收到多位Windows 11用户反馈,应用会无征兆突然闪退。
经调试定位,异常在调用TextPatternRange.GetText()方法时触发,抛出的异常信息如下:
System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'
(尝试读取或写入受保护内存,通常为其他内存区域损坏的表征)
- 参考微软论坛公开方案,在应用manifest中设置
uiaccess=true并完成应用签名,应用安装路径为C:\Program Files\,操作后问题无任何改善; - 在上述配置基础上,额外在manifest中将权限级别设置为
requireAdministrator,问题仍未解决; - 参考第三方软件的同类崩溃反馈,怀疑为Windows 11系统Bug,安装22H2预览版后测试,异常依旧存在。
为隔离问题、排除应用自身其他逻辑的干扰,我们基于公开可验证的焦点窗口选中文本获取方案编写了测试Demo,核心代码如下:
private void btnRefresh_Click(object sender, RoutedEventArgs e) { var p = Process.GetProcessesByName("notepad").FirstOrDefault(); var root = AutomationElement.FromHandle(p.MainWindowHandle); var documentControl = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Document); var textPatternAvailable = new PropertyCondition(AutomationElement.IsTextPatternAvailableProperty, true); var findControl = new AndCondition(documentControl, textPatternAvailable); var targetDocument = root.FindFirst(TreeScope.Descendants, findControl); var textPattern = targetDocument.GetCurrentPattern(TextPattern.Pattern) as TextPattern; string text = ""; foreach (var selection in textPattern.GetSelection()) { text += selection.GetText(255); Console.WriteLine($"Selection: \"{selection.GetText(255)}\""); } lblFocusedProcess.Content = p.ProcessName; lblSelectedText.Content = text; }
该Demo逻辑为:点击按钮时触发上述方法,通过UIAutomation获取记事本进程的主窗口,提取其中的选中文本后展示在界面标签中。测试结果显示:该Demo在最新版Windows 10上运行完全正常,即使manifest中不设置uiaccess=true也可正常工作;但在Windows 11上运行时会立即触发AccessViolationException导致崩溃。
目前我们计划向微软官方提交该问题Issue,同时也在考虑申请EV代码签名证书,对应用本体和安装包进行签名(该操作可消除安装时的系统红色安全警告,因本应用为免费分发项目,此前未配置EV签名)。
在此向各位技术开发者咨询以下问题:
- 该异常的可能诱发原因是什么?
- Windows 11是否对UIAutomation设置了更严格的权限管控规则?
后续我们也会持续基于上述复现代码开展测试,如有新的进展会同步更新问题内容。
内容的提问来源于stack exchange,提问作者ygosteli

