5

Jak wykryć, czy działa czytnik ekranu (JAWS)?C#: Jak wykryć, czy działa czytnik ekranu?

Jak rozumiem w .NET 4 możemy użyć AutomationInteropProvider.ClientsAreListening z przestrzeni nazw System.Windows.Automation.Provider, ale co jeśli muszę to zrobić dla .NET 2.0?

Próbowałem sprawdzić kod źródłowy ClientsAreListening, wywołuje zewnętrzną metodę RawUiaClientsAreListening z biblioteki UIAutomationCore.dll.

Czy masz pomysły na implementację wykrywania JAWS w .NET 2.0?

+0

Ciekawy - co zamierzasz robić inaczej, jeśli stwierdzisz, że czytnik ekranu jest uruchomiony? Zwróć uwagę, że niektóre aplikacje nie obsługujące przeglądarek mogą ustawiać flagę SPI_SCREENREADER, aby uzyskać fałszywe alarmy lub negatywy. Idealnie aplikacja powinna działać bez konieczności sprawdzania tej flagi. Czy naprawdę sprawdzasz ogólnie screenreaderów, czy JAWS? – BrendanMcK

Odpowiedz

4

Użyj SystemParametersInfo function przekazując uiAction z SPI_GETSCREENREADER.

Trzeba będzie użyć P/Invoke na to, na przykład:

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; 
     } 
    } 
} 

Jest to prawdopodobnie lepiej niż przy użyciu właściwości ClientsAreListening jak wynika to właściwość, aby powrócić prawdziwe dla dowolnego klienta automatyzacji, a nie tylko ekran czytelników.

zobacz także:

Należy również nasłuchiwać wiadomości WM_SETTINGCHANGE wykryć, czy czytnik ekranu uruchamia/zatrzymuje uruchomiony.


Aktualizacja (w odpowiedzi na komentarze BrendanMcK'S):

Mimo to nigdy nie jest wyraźnie udokumentowane w tak wielu słów, patrząc w opisie flagi myślę, że celem tej flagi jest stosunkowo jasne :

Określa, czy działa narzędzie do sprawdzania ekranu. Narzędzie do przeglądania ekranu kieruje informacje tekstowe do urządzenia wyjściowego, takiego jak syntezator mowy lub monitor brajlowski. Po ustawieniu tej flagi aplikacja powinna dostarczać informacje tekstowe w sytuacjach, w których w przeciwnym razie prezentowałaby graficznie informacje.

Co to jest o to, że aplikacje ustawić tę flagę, gdy aplikacja chce UI zachowywać się tak, jakby czytelnik ekran jest uruchomiony, niezależnie od tego, czy ta aplikacja jest rzeczywiście czytnik ekranu lub nie .

Odpowiednie rzeczy do zrobienia w odpowiedzi na tę flagę to add text in order to "read" otherwise intuitive UI state to the user. Jeśli potrzebne są zmiany radykalne, aby twój czytnik ekranu interfejsu użytkownika był dostępny, istnieje duże prawdopodobieństwo, że twój interfejs użytkownika nie jest tak intuicyjny, aby sygnalizować użytkowników i prawdopodobnie przy ponownym przemyśleniu.

+0

Świetnie! Działa! Dzięki! –

+1

Należy zauważyć, że ClientsAreListening informuje tylko o klientach dostępności, którzy aktywnie nasłuchują zdarzeń ułatwień dostępu. Mogą istnieć inne, które nadal korzystają z ułatwień dostępu - np. zeskrobać interfejs użytkownika dla czasowników rozpoznawania mowy - ale użyj innych środków, aby określić, kiedy należy skrobać i nie słuchaj zdarzeń związanych z dostępnością. W skrócie, ten interfejs API pozwala tylko wiedzieć, że musisz wysyłać zdarzenia; nie, czy klient dostępności jest uruchomiony. – BrendanMcK

+0

@BrendanMcK Odwrotnie, "SPI_GETSCREENREADER" jest po prostu flagą ustawianą przez czytniki ekranu, aby wskazać innym, że są uruchomione (niezależnie od użytej metody) – Justin

Powiązane problemy