C #: Как определить, работает ли программа чтения с экрана? - PullRequest
5 голосов
/ 10 ноября 2011

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

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

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

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

1 Ответ

4 голосов
/ 10 ноября 2011

Используйте функцию 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):

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

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

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

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

...