C#: Как определить, работает ли программа чтения с экрана?

Как определить, работает ли программа чтения с экрана (JAWS)?

Как я понимаю в.NET 4 мы можем использовать AutomationInteropProvider.ClientsAreListening от System.Windows.Automation.Provider пространство имен, но что если я должен сделать это для.NET 2.0?

Я пытался проверить ClientsAreListening Исходный код, он вызывает внешний RawUiaClientsAreListening метод из библиотеки UIAutomationCore.dll.

У вас есть идеи, как реализовать обнаружение JAWS в.NET 2.0?

1 ответ

Решение

Использовать SystemParametersInfo функция передачи 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):

Хотя это никогда явно не задокументировано в таком количестве слов, глядя на описание флага, я думаю, что назначение этого флага относительно ясно:

Определяет, запущена ли утилита просмотра экрана. Утилита просмотра экрана направляет текстовую информацию на устройство вывода, такое как синтезатор речи или дисплей Брайля. Когда этот флаг установлен, приложение должно предоставлять текстовую информацию в ситуациях, когда оно иначе представляло бы информацию графически.

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

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

Другие вопросы по тегам