为了账号安全,请及时绑定邮箱和手机立即绑定

UIAutomation 方法 ElementFromPoint() 从 Windows 10

UIAutomation 方法 ElementFromPoint() 从 Windows 10

C#
饮歌长啸 2021-06-30 14:00:48
我们正在开发一个 C# Windows 窗体应用程序并使用 UI 自动化来记录用户活动。我们的应用程序将其 DPI 感知声明为 Per-monitor,因此系统不会通过坐标虚拟化欺骗它。在 Windows 10 上,我们遇到了记事本问题:在执行屏幕缩放后,调用 UIA 方法ElementFromPoint()并传递正确的物理坐标时返回不正确的元素。此外,CurrentBoundingRectangle()调用返回的 BoundingRectangle 坐标也是不正确的:除以当前屏幕比例值,即 1.5 表示 150%。有没有人遇到过这个问题,你是如何解决的?背景并非记事本窗口的所有 UI 元素都会受到影响:只有系统按钮和主菜单项。其他元素,如主文本区域、滚动条、窗口标题、对话框按钮、子菜单项,都得到了正确处理。考虑以下测试代码:private CUIAutomation automation = new CUIAutomation();public async Task GetElement(int x, int y){    try    {        Debug.WriteLine($"MouseDown received: X={x} Y={y}");        await Task.Run(() =>        {            // Retrieving an UIA element lying on physical coordinates            tagPOINT point = new tagPOINT { x = x, y = y };            IUIAutomationElement clickedElement = automation.ElementFromPoint(point);            var elementName = clickedElement.GetCurrentPropertyValue(30005);            var elementRect = clickedElement.CurrentBoundingRectangle;            // Actually retrieved UIA element            Debug.WriteLine($"UIA element: Name={elementName} " +                $"Rect=[left={elementRect.left} top={elementRect.top} right={elementRect.right} bot={elementRect.bottom}]");        });    }    catch (Exception ex)    {        Debug.WriteLine(ex);    }}在 Win 10 上,此代码为“文件”主菜单项返回不正确的元素和 BoundingRectangle:MouseDown 收到:X=735 Y=391UIA 元素:名称=应用程序矩形=[左=475 上=249 右=822 机器人=268]系统按钮的 BoundingRectangle 不正确:MouseDown 收到:X=701 Y=282UIA 元素:名称=系统矩形=[左=453 上=183 右=475 机器人=205]并纠正其他 UI 控件的元素和 BoundingRectangle(即文件 -> 保存子菜单项):MouseDown 收到:X=1386 Y=666UIA 元素:名称=保存矩形=[左=1320 上=652 右=1452 机器人=691]这些结果不会在声明自己为系统 DPI 感知的旧版记事本上重现。例如,在 Windows 7 上总是检索正确的元素和边界矩形。此外,我还在 Win 10 上测试了其他实现 Per-monitor DPI 感知模式的应用程序:Acrobat Reader DC、Edge、Skype、Slack、Explorer。这些应用程序的主菜单也得到了正确处理:检索了正确的元素和边界矩形。因此,Windows 10 的记事本的 Per-monitor 模式实现中可能存在问题。
查看完整描述

1 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

经过大量测试后,我发现原因在于“首选 32 位”标志:当它为可执行项目启用时,从记事本中检索到不正确的 UIA 元素和边界矩形。

启用“首选 32 位”:

//img1.sycdn.imooc.com//60eaad4a000159ef05730424.jpg

禁用“首选 32 位”:

//img1.sycdn.imooc.com//60eaad550001db9c04780438.jpg


查看完整回答
反对 回复 2021-07-11
  • 1 回答
  • 0 关注
  • 349 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信