让 windows 10 位旁白说一些文字

Make windows 10 narrator to speak some text

我正在用 C++ 制作一个 GUI 应用程序。 有没有一种简单的方法可以让 windows 10 的旁白说一些文字? 当然,鉴于它目前处于活动状态。

有时有用的一个技巧是 select 文本字段中的一些文本,然后短暂地聚焦它。但是

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

其他屏幕 reader,特别是 Jaws 和 NVDA,提供 API 来执行此操作。 我什至是库 UniversalSpeech 的作者,它允许使当前 运行 屏幕 reader,如果有的话,说出文本,抽象出检测自己是哪个屏幕的需要运行。 鉴于叙述者在 windows 10 的最后 3 或 4 个版本中有了很大改进,支持它可能会很有趣,不仅在我自己的程序和我的特定用例中,而且在我的图书馆中的每个人。

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

注意这个问题不同于this one 答案建议直接使用语音 API。直接使用屏幕 readers API 而不是语音 API 有很大的好处:

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

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

谢谢。

据我所知,Microsoft 讲述人不会向开发人员公开 API,您可以使用 Windows 10 上的 Feedback App 为它推荐一个功能。

I want to achieve the same behavior as in a live region, i.e. have some text read by the SR as it appears at the bottom of a multiline rich text field, but in a native GUI app. For info, I'm using WXWidgets.

您可以使用UI 自动化事件来订阅属性 富文本字段的更改,以便在文本更新时收到通知。并且由于您使用的是第三方控件,因此您还需要为任何不包含提供程序的第三方控件实现提供程序。下面是关于 UI 自动化提供和 UI 供您参考的自动化事件:

UI Automation Events Overview

UI Automation Providers Overview

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

事实上,让旁白说话的最简单方法可能是:

  1. 将一些标签定义为活动区域
  2. 当旁白必须说出某些内容时,更改标签中的文本,然后发送更新通知

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

实时设置可以设置为 0=关闭、1=礼貌和 2=自信。 polite 和 assertive 的含义与 WAI ARIA 相同。 尽管现在(2021 年 4 月),叙述者总是在标签文本被替换后立即打断讲话,即使是在礼貌模式下也是如此。 assertive 模式的变化是文本甚至优先于正常键盘导航造成的中断,即在按 Tab 键、箭头键等时你可能听不到你在哪里。 因此,我完全不推荐它。

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

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