R4.03.3UI Automation设计

系统级无障碍接口

别名: UI Automation · 控件模式 · 自动化树 · Narrator

概念解释

Windows 上的辅助技术不靠截屏认按钮。它们查询应用通过系统无障碍接口暴露出的一棵树——今天这条接口是 UI Automation(UIA)。树上的每个节点要有名称、控件类型、值、状态,并实现对应的控件模式(control patterns):能点的实现 Invoke,能开关的实现 Toggle,能调数值的实现 RangeValue。放大镜、讲述人、第三方读屏和自动化测试走的是同一棵树。自绘控件如果只在像素上像按钮,却没有把节点填进这棵树,讲述人就无话可说。

它处理的是「系统级树是不是完整」,不是无障碍法规要求你达标到哪一级,也不是网页里的语义标签怎么写。用系统提供的窗口控件,树往往已经长好;用 DirectX、自绘 HWND 或跨平台自绘引擎,树要由应用自己当提供者补上。

机制

辅助技术与窗口之间隔着系统。应用是提供者,把可视化对象映射成 UIA 节点;讲述人是客户端,按用户命令读名称、走模式、改值。映射一旦缺失,客户端不能靠猜像素来补——没有名称就是无名,没有 Toggle 模式就把开关读成普通图片。控件模式比「角色」更硬:角色说明它是什么,模式说明可以对它做什么。一个看起来能拖的滑块如果没实现 RangeValue,讲述人无法调它,自动化测试也无法设值。

实时变化必须通过属性变更和结构变更通知推给客户端。只改画面、不发通知,讲述人仍停在旧值上。键盘焦点与 UIA 焦点应对准同一个对象,否则键盘用户看到的高亮和读屏读到的节点会错位。系统控件的价值正在于此:它们默认把名称、模式和通知都接到这棵树上,应用少做的是绘制,多保住的是那条查询通道。

边界

纯装饰的图标、分隔线和品牌插画不应进树,进了会变成读屏噪音;该进树的是能操作或必须被知晓的对象。远程桌面和部分游戏全屏会把树替换成一块大图像,UIA 在那一段时间里帮不上忙,需要应用提供自己的读屏挂钩或退出独占。网页嵌在窗口里时,浏览器引擎有自己的无障碍树,和宿主窗口的 UIA 树衔接处容易丢焦点或重复播报。自动化测试如果只用像素对比来代替 UIA 查询,测的不是这条接口是否接通。名称应是对用户有意义的词,而不是开发者的内部控件 ID——接口会把你填进去的字符串原样读出来。

怎么落地

  • 优先用系统控件;自绘控件必须作为 UIA 提供者填名称、控件类型、状态,并实现真正可执行的控件模式。
  • 焦点、选中、值变化和树结构增删都要发通知;键盘焦点落在哪,UIA 焦点就落在哪。
  • 不要把内部变量名当作 Name,也不要把装饰节点挂进树;给图标按钮提供与可见标签一致的名称。
  • 验证:打开讲述人,只听不看走完主任务,核对每个可操作对象是否被读成正确的类型和名称、开关能否被切换、滑块能否被调值。再在检查工具里看树,任何「画面上有按钮、树上没有节点」或「有节点但没有对应模式」都是接口缺口。最后用键盘走同一条路径,确认焦点高亮和读屏节点始终是同一个对象。

延伸

  • 同组R4.03.1 窗口、菜单与快捷键体系 · R4.03.2 键鼠与触摸并存的适配要求
  • 相邻R3.09 语义化结构与可访问性实现 · J1.04 法规要求
  • 站内检索UI Automation · control pattern · automation tree · Narrator

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/R4.03.3