【发布时间】: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