【问题标题】:ASP.NET MVC - How to detect if user is using a screen readerASP.NET MVC - 如何检测用户是否正在使用屏幕阅读器
【发布时间】:2018-09-19 19:22:48
【问题描述】:

所以我目前正在尝试检查用户是否在我们的网站上使用屏幕阅读器。我想检查他们是否是因为我们的网站提供了一个培训模块,如果他们使用屏幕阅读器,我想显示一个按钮,允许他们下载培训的可打印版本。

这是我迄今为止尝试过的:

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;
            }
        }
    }

我从以下 StackOverflow 线程中获取了这段代码:C# : How to detect if screen reader is running?

正如您在此线程中看到的,我使用的方法显然适用于某些人,但我目前在调用 ScreenReader.IsRunning 时总是得到“错误”。我将 ScreenReader.IsRunning 值存储在 ViewBag 中,然后在我看来,如果该值为 true,我将使用剃刀语法显示按钮。不太确定为什么它总是错误的。如果您使用的是 Windows 10,我认为如果您使用的是 Windows 10,我已经使用 JAWS 以及每个人的计算机上附带的讲述人对此进行了测试。任何帮助将非常感激。谢谢大家!

【问题讨论】:

  • 我没有适合您的解决方案,但我会告诉您为什么这不能按您的预期工作。您正在检查运行您的应用程序的服务器是否正在运行屏幕阅读器。这并没有告诉您有关客户端的任何信息。这是服务器端代码,您正在执行服务器端检查。
  • 为什么不简单地向所有人显示下载按钮?非视障用户也可能会觉得它很有帮助。
  • 嘿@Dan Wilson,这是客户的要求,因为客户希望尽可能多的人通过网络参加培训,并担心人们会下载 PDF 并参加考试而不是使用如果我们向所有人提供此选项,则网络。
  • @andrewmacpherson 我完全同意,根据我的研究,这是一个愚蠢的差事,试图让它发挥作用。我认为我可以做的只是提供一个“隐藏”链接,屏幕阅读器不会看到但会阅读,这样人们可以在需要该功能时以这种方式下载培训。但他们并没有真正从培训中赚钱。它更多的是合规性要求,并且通过网络进行培训允许我们的应用程序在培训结束时对他们的培训表现进行评分,而不是必须手动评分 PDF 版本。时间就是金钱
  • @Chet_Steadman 谨防使用视觉隐藏的链接,它们对于使用键盘的视力正常的人来说是个大问题。他们必须满足 WCAG Focus Visible。否则,键盘用户可能会意外聚焦并激活他们无法阅读的链接,

标签: c# asp.net-mvc accessibility screen-readers jaws-screen-reader


【解决方案1】:

无法检测用户是否正在运行屏幕阅读器。如果可能的话,它将为不道德的类型打开一扇门,让他们关注残疾人,或者提供完全不同的“无障碍”浏览器体验,而不是构建设计上具有包容性的界面。

您可以创建一个放置在屏幕外但仍按 Tab 键顺序放置的按钮,并使其在获得焦点时可见。然后盲人用户可以找到它,而有视力的键盘用户不会认为按钮获得焦点时发生了奇怪的事情。

【讨论】:

    【解决方案2】:

    我认为你只能检查用户是否有 chrome 扩展或类似的东西在客户端使用 javascript。

    想法: 您可以创建一个exebath 文件来检查用户系统并将有关此信息的信息发送到您的服务器。如果用户下载此文件并且没有屏幕阅读器,则加载页面。否则给出关于屏幕阅读器的错误。当响应来自用户计算机时,也许您可​​以使用SignalR 向用户显示内容。您可以将此文件设置为必须在用户系统中工作,并在用户加载页面时开始下载此文件。这不是一个好方法,但也许你可以用这种方式检查。

    【讨论】:

      【解决方案3】:

      HttpRequest.Browser 属性返回一个HttpBrowserCapabilities 对象,该对象列出发出请求的设备的功能。请记住,ASP.NET 使用作为 HTTP 请求的一部分发送的 User-Agent 字符串来识别客户端。然后为填充 HttpBrowserCapabilities 属性,ASP.NET 使用一组预安装的浏览器文件处理用户代理字符串,这些文件包含在以下位置:%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\CONFIG\浏览器

      HttpBrowserCapabilities Class

      还有更详细和更新检测设备信息的第三方,即51Degrees

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多