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 для любого клиента автоматизации, а не только для программ чтения с экрана.
Также см:
- Использование SystemParametersInfo из C# (SPI_GETSCREENREADER SPI_SETSCREENREADER) (переполнение стека)
- ИНФОРМАЦИЯ: Как клиенты и серверы должны использовать SPI_SETSCREENREADER и SPI_GETSCREENREADER (Microsoft KB)
Вы также должны слушатьWM_SETTINGCHANGE
сообщение, чтобы определить, запускается ли программа чтения с экрана.
Обновление(в ответ на комментарии BrendanMcK):
Хотя это никогда явно не задокументировано в таком количестве слов, глядя на описание флага, я думаю, что назначение этого флага относительно ясно:
Определяет, запущена ли утилита просмотра экрана. Утилита просмотра экрана направляет текстовую информацию на устройство вывода, такое как синтезатор речи или дисплей Брайля. Когда этот флаг установлен, приложение должно предоставлять текстовую информацию в ситуациях, когда оно иначе представляло бы информацию графически.
Это говорит о том, что приложения устанавливают этот флаг всякий раз, когда приложение желает, чтобы пользовательский интерфейс вел себя так, как будтопрограмма чтения с экрана работает, независимо от того, является ли это приложение на самом деле программой чтения с экрана или нет.
Подходящими действиями в ответ на этот флаг является добавление текста, чтобы "прочитать" пользователю интуитивно понятный пользовательский интерфейс. Если радикальные изменения необходимы для того, чтобы сделать вашу программу чтения с экрана пользовательского интерфейса доступной, то есть вероятность, что ваш пользовательский интерфейс также не настолько интуитивен для подписанных пользователей и, вероятно, мог бы сделать это заново.