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

时间:2011-11-10 12:46:07

标签: c# accessibility ui-automation screen-readers jaws-screen-reader

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

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

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

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

1 个答案:

答案 0 :(得分:4)

使用SystemParametersInfo function传递uiAction SPI_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,而不仅仅是屏幕阅读器。

另见:

您还应该收听WM_SETTINGCHANGE消息,以检测屏幕阅读器是否开始/停止运行。


更新(响应BrendanMcK的评论):

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

  

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

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

响应此标志的合适事项是add text in order to "read" otherwise intuitive UI state to the user。如果需要进行激进更改以使您的UI屏幕阅读器可访问,那么您的用户界面也可能不会让用户感到直观,并且可能会重新思考。