uiAction
をSPI_GETSCREENREADER
とすると、SystemParametersInfo
functionを使用してください。
次の例のように、このために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;
}
}
}
これは、このプロパティだけではなく、スクリーンリーダー、任意のオートメーションクライアントのためにtrueを返すように見えるようClientsAreListening
プロパティを使用するよりも可能性が優れています。
も参照してください:
あなたはスクリーンリーダーが実行を停止/起動するかどうかを検出するWM_SETTINGCHANGE
メッセージのためにも耳を傾けなければなりません。
(BrendanMcKのコメントに応答して)更新:
これは明示的に私は、このフラグの目的は、比較的明確であると考えフラグの説明を見て、できるだけ多くの単語で文書化されることはありませんが、 :
スクリーンレビューアユーティリティが実行されているかどうかを決定します。スクリーンレビューユーティリティは、テキスト情報を音声合成装置または点字ディスプレイなどの出力装置に送る。このフラグが設定されている場合、アプリケーションは情報をグラフィカルに表示する状況でテキスト情報を提供する必要があります。
これは言っていると、アプリケーションは、そのアプリケーションが実際にスクリーンリーダーかであるか否かにかかわらず、アプリケーションがスクリーンリーダーは、を実行しているかのように動作するUIを望むたびに、このフラグを設定することです。
このフラグに応答して適切なことはadd text in order to "read" otherwise intuitive UI state to the userです。 ラジカルあなたのUIスクリーンリーダーにアクセスできるようにするために変更が必要な場合は、あなたのUIもそれを直感的なものにしていない可能性があります。
好奇心 - スクリーンリーダーが動作していると判断した場合、どういうことをしますか?一部の非スクリーンリーダーアプリでは、SPI_SCREENREADERフラグを設定することがあるため、誤検出やネガティブな表示が可能です。理想的には、あなたのアプリはこのフラグをチェックする必要なく動作するはずです。あなたは一般的にスクリーンリーダー、またはJAWSを具体的にチェックしていますか? – BrendanMcK