首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIAutomation在Windows11上抛出AccessViolationException

UIAutomation在Windows11上抛出AccessViolationException
EN

Stack Overflow用户
提问于 2022-07-05 15:44:33
回答 1查看 129关注 0票数 0

问题:

我们有一个用C#编写的应用程序,该应用程序使用UIAutomation在其他应用程序(Word、OpenOffice、记事本等)中获取当前文本(选择文本或carret后面的单词)。

所有的工作都很好的Windows 10,甚至高达21H2,最后一次更新检查今天完成。但我们有几个客户告诉我们,该应用程序正在Windows 11上突然关闭。

调试之后,在尝试使用System.AccessViolationException ()方法时,我看到了一些TextPatternRange.GetText:

System.AccessViolationException:“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”

到目前为止我们尝试过的:

F 215

可复制示例

为了能够隔离这个问题(并检查我们的应用程序中没有其他原因导致异常),我迅速进行了以下测试(基于:How to get selected text of currently focused window?验证的答案)

代码语言:javascript
复制
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;
    }

当按下按钮时,会调用此方法并将结果显示在标签中。该方法使用UIAutomation获取记事本进程并提取选定的文本。

这在最新更新的Windows 10中运行良好,在Windows 11上立即与AccessViolationException崩溃。在Windows 10上,即使清单中没有uiaccess=true设置,它也能工作。

问题/下一步

有人知道/知道是什么原因造成的吗?关于UIAutomation,Windows 11是更多的吗?

在我这一边,我可能会打开微软的一个问题。我们可能遵循的一个轨道是获得一个EV,并签署应用程序本身和安装程序,因为它也将加强安装过程,删除大的红色警告。但是,由于这是一个免费发布的应用程序,我们没有这样做,因为它没有它的工作。

我还将继续使用可复制代码进行测试,并在出现任何新问题时更新这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-07 06:39:03

我在MSDN论坛上发布了同样的问题,得到了以下答案:https://learn.microsoft.com/en-us/answers/questions/915789/uiautomation-throws-accessviolationexception-on-wi.html

使用IUIautomation代替System.Windows.Automation在Windows 11上工作。

因此,我认为这是解决了,但如果有人有其他想法或知道发生了什么,欢迎你评论!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72872197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档