让 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 有很大的好处:
- 屏幕reader 用户习惯于特定的语音设置(语音、速率、音高、语言和区域口音等)。控制面板中设置的默认设置可能根本不相似。这意味着
- 用户是否必须在控制面板中配置语音设置,什么是所有应用程序的全局设置;不太好
- and/or 在业务应用程序中管理特定于应用程序的语音设置,该应用程序根本不专门用于语音内容;例如,在金融应用程序中找到语音设置会很奇怪。
- 同时使用屏幕reader和独立的语音引擎意味着两者可以同时说话,这当然是非常烦人的。其实在实践中经常发生,我已经测试过了。
那么,有没有一种简单的方法可以让旁白说出一些文字?
我的程序是用 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 供您参考的自动化事件:
过了好一会儿,我回答我自己的问题!
事实上,让旁白说话的最简单方法可能是:
- 将一些标签定义为活动区域
- 当旁白必须说出某些内容时,更改标签中的文本,然后发送更新通知
将标签变成实时区域并在文本更改时发送通知的说明如下:
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).
带实时设置的标签在放置在屏幕外甚至隐藏时仍然有效。
我正在用 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 有很大的好处:
- 屏幕reader 用户习惯于特定的语音设置(语音、速率、音高、语言和区域口音等)。控制面板中设置的默认设置可能根本不相似。这意味着
- 用户是否必须在控制面板中配置语音设置,什么是所有应用程序的全局设置;不太好
- and/or 在业务应用程序中管理特定于应用程序的语音设置,该应用程序根本不专门用于语音内容;例如,在金融应用程序中找到语音设置会很奇怪。
- 同时使用屏幕reader和独立的语音引擎意味着两者可以同时说话,这当然是非常烦人的。其实在实践中经常发生,我已经测试过了。
那么,有没有一种简单的方法可以让旁白说出一些文字?
我的程序是用 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 供您参考的自动化事件:
过了好一会儿,我回答我自己的问题!
事实上,让旁白说话的最简单方法可能是:
- 将一些标签定义为活动区域
- 当旁白必须说出某些内容时,更改标签中的文本,然后发送更新通知
将标签变成实时区域并在文本更改时发送通知的说明如下: 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).
带实时设置的标签在放置在屏幕外甚至隐藏时仍然有效。