c++ - 让 Windows 10 旁白者说出一些文字

标签 c++ c winapi accessibility screen-readers

我正在用 C++ 制作一个 GUI 应用程序。 有没有一种简单的方法可以让 Windows 10 的旁白者说出一些文字? 当然,考虑到它目前处于事件状态。

有时有效的技巧是在文本字段中选择一些文本,然后短暂地对其进行聚焦。但是

  • 它并不总是有效
  • 焦点前后移动。即使时间很短,它也是侵入性的,可能会干扰用户当前正在做的任何事情
  • 文本字段必须出现在屏幕上的某个位置,但这并不总是需要的

如果可能的话,我想要一个没有这三个问题的解决方案。

其他屏幕阅读器,特别是 Jaws 和 NVDA,提供 API 来执行此操作。 我什至是一个库的作者,UniversalSpeech ,它允许使当前正在运行的屏幕阅读器(如果有)朗读文本,从而无需检测自己正在运行哪个屏幕阅读器。 鉴于叙述者在 Windows 10 的最新 3 或 4 个版本中得到了很大改进,支持它可能会很有趣,不仅在我自己的程序和我的特定用例中,而且对于我库中的每个人。

但是,我找不到任何文档或任何信息来告诉我叙述者是否具有类似于 Jaws 或 NVDA 的 API。 事实上,如果“讲述人”目前没有这样的 API,那么建议 Microsoft 添加一个可能会很有趣。

请注意,这个问题与 this one 等问题不同。 答案建议直接使用语音 API。直接使用屏幕阅读器 API 而不是语音 API 有很大的好处:

  • 屏幕阅读器用户习惯于特定的语音设置(语音、语速、音调、语言和地区口音等)。控制面板中设置的默认设置可能根本不相似。这意味着
    • 用户是否必须在控制面板中配置语音设置,什么是所有应用程序的全局设置;不太好
    • 和/或在根本不专门用于语音内容的业务应用程序中管理应用程序特定的语音设置;例如,在金融应用程序中找到语音设置会很奇怪。
  • 同时使用屏幕阅读器和独立语音引擎意味着两者可以同时说话,这当然是非常烦人的。事实上在实践中这种情况经常发生,我已经测试过。

那么,有没有一种简单的方法可以让旁白说出一些文字?

我的程序是用C++编写的,库是用C编写的,所以理论上我可以通过LoadLibrary/GetProcAddress(如果需要)访问整个winapi。 请不要提供任何依赖于 C# 或 VisualStudio 的解决方案。

谢谢。

最佳答案

过了好一会儿,我回答了我自己的问题!

事实上,让叙述者说话的最简单的方法可能是:

  1. 将某个标签定义为事件区域
  2. 当讲述人必须说出某些内容时,请更改标签中的文本,然后发送更新通知

将标签变成事件区域并在文本更改时发送通知的说明如下: https://learn.microsoft.com/en-us/accessibility-tools-docs/items/win32/text_livesetting

实时设置可以设置为 0=关闭、1=礼貌和 2=自信。礼貌和自信的含义与 WAI ARIA 中的含义相同。 尽管存在(2021 年 4 月),但一旦标签文本被替换,叙述者总是会中断讲话,即使是在礼貌模式下也是如此。 断言模式的变化是,文本甚至优先考虑正常键盘导航造成的中断,即按 Tab 键、箭头键等时您可能听不到自己所在的位置。 因此,我根本不推荐它。

另请注意,实时设置仅适用于静态文本控件(win32 STATIC 窗口类)。 当应用于文本字段和文本区域(win32 EDIT 窗口类)时,它被完全忽略。

具有实时设置的标签在放置在屏幕外甚至隐藏时仍然有效。

关于c++ - 让 Windows 10 旁白者说出一些文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57922893/

相关文章:

c++ - 如何使用 C++ 在 Windows Vista 中读取 NMEA 语句

c++ - 剔除点云中的受阻点

c++ - Barrier算法迭代后如何访问当前解决方案?

c++ - 模板模板参数 - std::array 的扩展

java - 将 .jar 库与我的 .jar 结合

python - 有什么更好的方法可以在 Python 中从 Active Directory 域获取用户/组信息?

c++ - Boost 属性树的并发问题

c - unsigned char 和 char 异或运算

c - 用C读取二进制文件

winapi - 如何在另一个线程的上下文中调用函数?