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.
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