问题:
我们有一个用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?验证的答案)
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,并签署应用程序本身和安装程序,因为它也将加强安装过程,删除大的红色警告。但是,由于这是一个免费发布的应用程序,我们没有这样做,因为它没有它的工作。
我还将继续使用可复制代码进行测试,并在出现任何新问题时更新这个问题。
发布于 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上工作。
因此,我认为这是解决了,但如果有人有其他想法或知道发生了什么,欢迎你评论!
https://stackoverflow.com/questions/72872197
复制相似问题