C#:如何检测屏幕阅读器是否正在运行?

如何检测屏幕阅读器是否正在运行(JAWS)?

正如我在.NET 4中所理解的,我们可以使用System.Windows.Automation.Provider命名空间中的AutomationInteropProvider.ClientsAreListening ,但是如果我必须为.NET 2.0做什么呢?

我试图检查ClientsAreListening源代码,它从RawUiaClientsAreListening库调用外部RawUiaClientsAreListening方法。

您对如何在.NET 2.0中实现JAWS检测有任何想法吗?

使用SystemParametersInfo函数传递uiActionSPI_GETSCREENREADER

您需要使用P / Invoke ,例如:

 internal class UnsafeNativeMethods { public const uint SPI_GETSCREENREADER = 0x0046; [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref bool pvParam, uint fWinIni); } public static class ScreenReader { public static bool IsRunning { get { bool returnValue = false; if (!UnsafeNativeMethods.SystemParametersInfo(UnsafeNativeMethods.SPI_GETSCREENREADER, 0, ref returnValue, 0)) { throw new Win32Exception(Marshal.GetLastWin32Error(), "error calling SystemParametersInfo"); } return returnValue; } } } 

这可能比使用ClientsAreListening属性更好,因为此属性似乎对任何自动化客户端返回true,而不仅仅是屏幕阅读器。

另见:

  • 使用C#中的SystemParametersInfo(SPI_GETSCREENREADER SPI_SETSCREENREADER)(堆栈溢出)
  • 信息:客户端和服务器应如何使用SPI_SETSCREENREADER和SPI_GETSCREENREADER(Microsoft KB)

您还应该侦听WM_SETTINGCHANGE消息以检测屏幕阅读器是否启动/停止运行。


更新 (回应BrendanMcK的评论):

虽然这从未明确记录在很多单词中,但是看一下标志的描述我认为这个标志的目的是相对清楚的:

确定屏幕审阅者实用程序是否正在运行。 屏幕评论工具将文本信息引导到输出设备,例如语音合成器或盲文显示器。 设置此标志后,应用程序应在其以其他方式以图形方式显示信息的情况下提供文本信息。

这就是应用程序设置此标志,只要应用程序希望UI的行为就像屏幕阅读器正在运行一样, 无论该应用程序是否实际上是一个屏幕阅读器

响应于该标志的合适的事情是添加文本以便向用户“读取”直观的UI状态 。 如果需要进行彻底的更改以使您的UI屏幕阅读器可访问,那么您的UI也可能不那么直观地指向用户,并且可能会重新思考。

Interesting Posts