【发布时间】:2019-09-13 11:33:59
【问题描述】:
我正在用 C++ 制作一个 GUI 应用程序。 有没有一种简单的方法可以让 Windows 10 的叙述者说出一些文字? 当然,它目前处于活动状态。
有时有效的技巧是在文本字段中选择一些文本,然后短暂聚焦。但是
- 它并不总是有效
- 焦点被移出和移回。即使是很短的时间,它也是侵入性的,并且可能会干扰用户当前正在做的任何事情
- 文本字段必须出现在屏幕上的某个位置,这并不总是需要的
如果可能的话,我想要一个没有这三个问题的解决方案。
其他屏幕阅读器,尤其是 Jaws 和 NVDA,提供了 API 来执行此操作。 我什至是一个库UniversalSpeech 的作者,它允许当前运行的屏幕阅读器(如果有)朗读文本,从而抽象出检测自己正在运行的屏幕阅读器的需要。 鉴于在 Windows 10 的最后 3 或 4 个版本中,旁白有了很大的改进,支持它可能会很有趣,不仅在我自己的程序和我的特定用例中,而且对于我库中的每个人。
但是,我找不到任何文档或任何东西告诉我叙述者是否具有类似于 Jaws 或 NVDA 的 API。 事实上,如果目前没有这样的讲述人 API,建议微软添加一个可能会很有趣。
注意这个问题不同于this one 答案建议直接使用语音API。直接使用屏幕阅读器 API 而不是语音 API 有很大的好处:
- 屏幕阅读器用户习惯于特定的语音设置(语音、速率、音高、语言和地区口音等)。控制面板中设置的默认设置可能完全不同。这意味着
- 用户是否必须在控制面板中配置语音设置,所有应用程序的全局设置;不太好
- 和/或在业务应用程序中管理特定于应用程序的语音设置,这些设置根本不专门用于语音内容;例如,在金融应用中找到语音设置会很奇怪。
- 同时使用屏幕阅读器和独立语音引擎意味着两者可以同时说话,这当然是非常烦人的。事实上,在实践中它经常发生,我已经测试过了。
那么,有没有一种简单的方法可以让叙述者说出一些文字?
我的程序是 C++,库是 C,所以理论上我可以访问整个 winapi,如果需要,可以通过 LoadLibrary/GetProcAddress。 请不要提供任何依赖 C# 或 VisualStudio 的解决方案。
谢谢。
【问题讨论】:
-
@VTT:语音合成!= 屏幕阅读器。
-
您不需要与屏幕阅读器的 API 对话,而是实现操作系统的辅助功能 API。请参阅 UI Automation and Active Accessibility 和 Developing apps for accessibility。然后屏幕阅读器应该“从那里获取”。
-
嗯,好的,当然。但是,我怎样才能做相当于网络应用程序的实时区域?我有一个多行文本字段,当它们出现时应该说出它们。
-
@QuentinC 首先,您需要评估 UI 自动化是否可以满足您的要求。对于快速测试,您可以使用Inspect.exe tool 来查看它是否可以读取 Web 应用程序的实时区域的文本?然后你可能需要学习 UI 自动化技术来实现你自己的应用程序。
标签: c++ c winapi accessibility screen-readers