ASP.NET MVC — как определить, использует ли пользователь программу чтения с экрана

Поэтому сейчас я пытаюсь проверить, использует ли пользователь программу чтения с экрана на нашем сайте. Причина, по которой я хотел бы проверить, так ли это, заключается в том, что наш сайт предоставляет учебный модуль, в котором, если они используют программу чтения с экрана, я хотел бы показать кнопку, которая позволит им загрузить версию обучения для печати.

Вот что я пробовал до сих пор:

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#: Как определить, запущена ли программа чтения с экрана?

Метод, который я использую, по-видимому, работает для некоторых, как вы можете видеть в этой теме, но в настоящее время я всегда получаю «false» при вызове ScreenReader.IsRunning. Я сохраняю значение ScreenReader.IsRunning в ViewBag, а затем, на мой взгляд, использую синтаксис бритвы, чтобы показать кнопку, если это значение истинно. Не совсем уверен, почему это всегда ложно. Я проверил это с помощью JAWS, а также с помощью Экранного диктора, который есть на каждом компьютере, если вы используете Windows 10, я думаю. Любая помощь приветствуется. Спасибо вам всем!


person Chet_Steadman    schedule 19.09.2018    source источник
comment
У меня нет решения для вас, но я скажу вам, почему это не работает так, как вы ожидаете. Вы проверяете, работает ли на сервере, на котором запущено ваше приложение, программа чтения с экрана. Это ничего не говорит вам о клиенте. Это код на стороне сервера, и вы выполняете проверки на стороне сервера.   -  person AaronLS    schedule 19.09.2018
comment
Почему бы просто не показать всем кнопку загрузки? Пользователи без нарушений зрения также могут найти это полезным.   -  person Dan Wilson    schedule 19.09.2018
comment
Привет, @Dan Wilson, это запрос от клиента, так как клиент хочет, чтобы как можно больше людей проходили обучение через Интернет, и беспокоится, что люди будут загружать PDF-файл и проходить тест вместо использования Интернета, если мы предоставим эту возможность для каждый.   -  person Chet_Steadman    schedule 19.09.2018
comment
@AaronLS Возможно, это не решение, но оно, по крайней мере, указывает мне правильное или, лучше сказать, другое направление. Спасибо за ответ.   -  person Chet_Steadman    schedule 19.09.2018
comment
Онлайн-обучение недоступно? Возможно, именно на этом вам следует сосредоточиться. Если вы предоставляете PDF-файл для обучения, убедитесь, что PDF-файл помечен, чтобы средство чтения с экрана знало структуру документа — helpx.adobe.com/acrobat/using/   -  person slugolicious    schedule 19.09.2018
comment
Это упражнение в бесполезности. Это невозможно сделать надежно, и самое ответственное, что нужно сделать, это сказать «нет» запросу вашего клиента. Они зарабатывают деньги на обучении, тесте или на том и другом? Самый простой подход — сделать все форматы обучения доступными для всех и позволить им выбирать, какой из них им больше всего подходит. Можно брать деньги за загрузку PDF, и все форматы могут быть доступны за одну полную плату.   -  person andrewmacpherson    schedule 20.09.2018
comment
@andrewmacpherson Я полностью согласен, и, судя по тому, что я исследовал, пытаться заставить это работать - глупая затея. Я думаю, что я могу просто предоставить скрытую ссылку, которая не будет видна, но прочитана программами чтения с экрана, чтобы люди могли загрузить обучение таким образом, если им понадобится эта функциональность. Но на самом деле они не зарабатывают деньги на обучении. Это больше похоже на требование соответствия, и прохождение обучения через Интернет позволяет нашему приложению оценивать их эффективность обучения в самом конце обучения, а не PDF-версию, которую нужно оценивать вручную. Время - деньги   -  person Chet_Steadman    schedule 20.09.2018
comment
@Chet_Steadman остерегайтесь использования визуально скрытых ссылок, они представляют большую проблему для зрячих людей, использующих клавиатуру. Они должны соответствовать WCAG Focus Visible. В противном случае пользователь клавиатуры может случайно сфокусироваться и активировать ссылку, которую он не может прочитать.   -  person andrewmacpherson    schedule 24.09.2018
comment
@andrewmacpherson попался. Эй, спасибо за комментарии. Обязательно все учту. Соответствие 508 — это то, в чем я новичок, так что в дальнейшем я буду считать это усвоенным уроком, ха-ха.   -  person Chet_Steadman    schedule 25.09.2018


Ответы (3)


Невозможно определить, использует ли пользователь программу чтения с экрана. Если бы это было возможно, это открыло бы двери для недобросовестных типов, которые могли бы нацеливаться на людей с ограниченными возможностями, или для предоставления совершенно другого «доступного» браузера вместо создания интерфейсов, которые были бы инклюзивными по дизайну.

Вы можете создать кнопку, расположенную за пределами экрана, но все еще в порядке табуляции, и сделать ее видимой, когда она получает фокус. Тогда слепые пользователи могли найти ее, а зрячие пользователи клавиатуры не подумали бы, что произошло что-то странное, когда кнопка получила фокус.

person a11y_guru    schedule 22.10.2018

Я думаю, вы можете только проверить, есть ли у пользователя расширения Chrome или что-то подобное, работающее на стороне клиента с помощью javascript.

Идея: вы можете создать файл exe или bath для проверки системы пользователей и отправить информацию об этом на ваш сервер. Если пользователь загрузил этот файл и нет программы чтения с экрана, загрузите страницу. В противном случае выдать ошибку о программе чтения с экрана. И когда ответ приходит с пользовательского компьютера, возможно, вы можете использовать SignalR для отображения контента пользователю. Вы можете сделать этот файл обязательным для работы в системе пользователей и начать загрузку этого файла, когда пользователь загрузит страницу. Это не очень хороший способ, но, возможно, вы можете проверить это таким образом.

person Mustafa Alan    schedule 22.10.2018

Свойство HttpRequest.Browser возвращает объект HttpBrowserCapabilities, в котором перечислены возможности устройства, отправившего запрос. Имейте в виду, что ASP.NET использует строку User-Agent, отправляемую как часть HTTP-запроса, для идентификации клиента. Затем, чтобы заполнить свойства HttpBrowserCapabilities, ASP.NET обрабатывает строку пользовательского агента, используя набор предустановленных файлов браузера, которые содержатся в следующем расположении: %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\CONFIG\. Браузеры

Класс HttpBrowserCapabilities

Есть также сторонние, которые гораздо более подробны и обновлены с информацией об обнаружении устройства, например, 51Degrees

person Angel_D    schedule 22.10.2018