我创建的应用程序脱离了任何本机框架。所有渲染均在 OpenGL 中进行,并由 GLFW 提供上下文,全部采用 C 语言,无需依赖任何框架来提供兼容性。因此,像 NVDA 这样的标准屏幕阅读器没有机会获取信息(不包括 OCR),而我的应用程序是一个可访问性黑洞。如何为屏幕阅读器提供一个可以使用的界面?我认为这是每个操作系统的事情......这在 Windows、Linux、BSD 甚至 Android 上怎么可能呢?在 *NIX 世界中,我认为这取决于桌面环境...我找到了很多关于此的信息,以框架为起点,但很难找到有关如何从头开始执行此操作的资源。
我完全意识到这远远超出了单个开发人员的能力,并且知道通过忽略本机接口来编写程序是一个常见的可访问性漏洞,建议您避免这种情况。
然而,我很难找到资源和切入点来探索这个主题。有人能指出我正确的方向吗?
TL;DR:如何从头开始提供屏幕阅读器兼容性。不是详细的——而是概念上的。
正如您已经清楚地认识到的那样,您的应用程序是一个可访问性黑洞,因为您正在使用渲染引擎。<canvas>对于 OpenGL、SDL、网络或任何在没有特定辅助功能支持的情况下渲染某些内容的库来说,它基本上是相同的。
我们可以讨论几种可能性:
然而,它并不止于此。支持屏幕阅读器不足以使您的应用程序真正易于访问。您还必须考虑许多其他事情。
这个选项当然是最好的,因为如果您正确地完成工作,辅助技术的用户(不仅仅是屏幕阅读器)通常会对完全可访问的应用程序感到宾至如归。然而,这也是迄今为止最难的,因为你必须重新发明一切。您必须将界面分解为组件,告诉每个组件属于哪个类别(更通常称为角色),进行回调以获取值和描述等。
如果您正在进行 Web 开发,请将其与您必须在任何地方使用 ARIA 进行比较,因为没有默认值、没有标题、没有段落、没有输入字段、没有按钮等。这是一项艰巨的工作!但如果你做得很好,你的应用程序将很容易访问。
您可以通过查看开源 GUI 工具包或浏览器来获得有关如何执行此操作的代码和想法。
当然,每个操作系统使用的 API 都不同。UIA 和 IAccessible2 适用于 Windows,但 MacOS 和一些 Linux 桌面也具有基于相同根原理的特定于操作系统的辅助功能 API。
关于术语的注意事项:辅助功能服务器或提供程序是您正在使用的应用程序或 GUI 工具包,而辅助功能客户端或消费者是屏幕阅读器(或其他辅助工具)。
碰巧的是,您当然没有义务重新发明轮子!许多人完成了上述第 1 点的工作,并产生了通常称为 GUI 工具包的库。
其中一些众所周知通常会生成易于访问的应用程序,而另一些则众所周知会生成完全无法访问的应用程序。QT、WXWidgets 和 Java SWT 是其中三个具有相当好的辅助功能支持的工具。因此,您只需使用其中之一及其关联的辅助功能 API,就可以大大简化工作。您将不必直接与 UIA/IAccessible2 和其他平台上的类似 API 的操作系统进行对话。
但要小心,这并不像看起来那么容易:GUI 工具包提供的所有组件不一定都能在所有平台上访问。有些组件可能可以直接访问,其他一些组件需要配置和/或您这边的一些特定代码,而有些组件无论如何都无法访问。有些可以在 Windows 下访问,但不能在 MacOS 下访问,反之亦然。例如,GTK 是 GNOME 下 Linux 下制作可访问应用程序的首选,但 Windows 下 GTK 的结果却很差。另一个例子:wxWidgets 的 DataView 控件在 MacOS 下众所周知,但它是在 Windows 下模拟的,因此更难访问。如有疑问,最好是在您打算支持的所有操作系统和屏幕阅读器组合下进行测试。
遗憾的是,对于游戏来说,使用 GUI 工具包可能不是一个可行的选择,即使存在能够显示 3D 场景的 OpenGL 组件。第三种可能性来了。
一些屏幕阅读器提供 API 来让它们说话、调整某些设置和/或在盲文显示器上显示某些内容。如果您不能或不想使用 GUI 工具包,这可能是一个解决方案。Jaws 附带一个名为 FSAPI、NVDA 的 API 和 NVDA 控制器客户端。Apple 还允许以编程方式控制 VoiceOver 的多个方面。
但仍然存在一些缺点:
考虑 WCAG 以及如何将其转移到桌面应用程序,实际上您正在绕过大多数最佳实践,这些最佳实践首先建议使用众所周知的标准组件,并且仅在真正必要时进行自定义。因此,当且仅当不可能使用良好的 GUI 工具包,或者所使用的 GUI 工具包的可访问性不够时,才应该理想地使用第三种可能性。
我是 UniversalSpeech 的作者,这是一个小型库,试图统一与多个屏幕阅读器的直接对话。如果您有兴趣的话可以看一下。
如果您的应用程序无法单独访问,您可以将屏幕阅读器特定的脚本分发给用户。可以指示这些脚本获取信息以提供给用户、添加额外的键盘快捷键和其他一些内容。Jaws 有自己的脚本语言,而 NVDA 脚本是用 Python 开发的。据我所知,MacOS 下的 VoiceOver 还具有脚本编写功能。
我向您提供了第四点供您参考,但由于您是从一个完全无法访问的应用程序开始的,所以我不建议您这样做。为了使脚本能够做有用的事情,您必须有一个可用的可访问基础。脚本可以帮助解决小的可访问性问题,但仅使用脚本将完全不可访问的应用程序变成可访问的应用程序几乎是不可能的。此外,您必须将这些脚本与您的应用程序分开分发,并且用户必须安装它们。对于某些人来说这可能会很困难,具体取决于您的目标受众。
屏幕阅读器支持并不是一切。这超出了你的问题,所以我不会详细介绍,但如果你真的想制作一个易于访问的应用程序,它不仅易于访问,而且对于屏幕阅读器用户来说使用起来也很舒适,你不应该忘记以下几点。这根本不是需要注意的其他事项的详尽列表。
| 归档时间: |
|
| 查看次数: |
917 次 |
| 最近记录: |