5

スクリーンリーダーが動作しているかどうかを検出する方法(JAWS)C#:スクリーンリーダーが動作しているかどうかを検出するには?

私が.NET 4で理解しているように、のAutomationInteropProvider.ClientsAreListeningを使用できますが、.NET 2.0ではどうすればいいですか?

私はClientsAreListeningソースコードを検査しようとしましたが、UIAutomationCore.dllライブラリから外部RawUiaClientsAreListeningメソッドを呼び出します。

.NET 2.0でJAWS検出を実装する方法はありますか?

+0

好奇心 - スクリーンリーダーが動作していると判断した場合、どういうことをしますか?一部の非スクリーンリーダーアプリでは、SPI_SCREENREADERフラグを設定することがあるため、誤検出やネガティブな表示が可能です。理想的には、あなたのアプリはこのフラグをチェックする必要なく動作するはずです。あなたは一般的にスクリーンリーダー、またはJAWSを具体的にチェックしていますか? – BrendanMcK

答えて

4

uiActionSPI_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もそれを直感的なものにしていない可能性があります。

+0

素晴らしい!それは動作します!ありがとう! –

+1

ClientsAreListeningは、アクセシビリティイベントをアクティブにリッスンするアクセシビリティクライアントについてのみ通知します。まだアクセシビリティを使用している他の人がいるかもしれません。音声認識のための動詞のためのUIをスクラップするが、何かをスクラップするかどうかを判断するために他の手段を使用し、アクセシビリティイベントを聞かない。要するに、このAPIは、イベントを送信する必要があることを通知するだけです。アクセシビリティクライアントが実行されているかどうかは関係ありません。 – BrendanMcK

+0

@BrendanMcK逆に、 'SPI_GETSCREENREADER'はスクリーンリーダーが実行中であることを他の人に知らせるために設定されたフラグです(使用方法に関係なく) – Justin

関連する問題