2010-09-29 16 views
2

J'essaie de détecter si un lecteur d'écran est attaché à mon application afin que je puisse améliorer l'expérience pour les utilisateurs aveugles et malvoyants. J'utilise cette API win32 (http://msdn.microsoft.com/en-us/library/ms724947%28VS.85%29.aspx), et en spécifiant SPI_GETSCREENREADER comme uiAction. Appel ressemble à ceci:Pourquoi le narrateur ne se signale-t-il pas comme un lecteur d'écran à Windows?

int iAction = 70; // SPI_GETSCREENREADER constant; 
int iParam = 0; 
int iUpdate = 0; 
bool result = false; 
bool bReturn = SystemParametersInfo(iAction, iParam, &result, iUpdate); 

Si JAWS est en cours d'exécution, ou pour cette matière l'utilitaire d'agrandissement, cette API signale qu'un lecteur d'écran est attaché. Cependant, si je n'ai qu'un lecteur d'écran intégré (MS Narrator), cette API signale qu'aucun lecteur d'écran n'est connecté.

Est-ce vraiment le cas? Est-ce que les gens de chez Microsoft ont vraiment décidé de ne pas signaler le lecteur d'écran intégré en tant que lecteur d'écran?

Répondre

1

Je ne peux pas tester le code mais malheureusement vous avez probablement raison. Le Narrateur est un lecteur d'écran très basique qui ne fournit pratiquement aucune fonctionnalité utile autre que de vous permettre de voir si votre lecteur d'écran principal s'est écrasé. La rumeur veut que Microsoft ait voulu en faire un lecteur d'écran complet lors de sa sortie initiale, mais a fait marche arrière à d'éventuels problèmes antitrust de la part des entreprises qui produisaient déjà des lecteurs d'écran. Notez que c'est ce que j'ai entendu sur certaines des listes d'email de cécité que j'ai l'habitude d'être sur mais ne peut pas vérifier s'il y a n'importe quelle vérité à lui. Si c'est vrai, cela expliquerait pourquoi le Narrateur a boitillé sans aucune amélioration réelle aussi longtemps que je me souvienne. Je ne m'inquiéterais pas du Narrateur, si un utilisateur utilise votre application, il utilisera un lecteur d'écran décent tel que Jaws. J'ai utilisé un logiciel de lecture d'écran toute ma vie et je n'ai jamais connu personne pour utiliser Narrator comme lecteur d'écran principal. Si vous souhaitez tester avec un lecteur d'écran gratuit, je recommanderais NVDA Dans mon expérience, il n'est pas aussi bon que les mâchoires, mais est un lecteur d'écran assez utilisable sans le prix élevé.

1

Si quelqu'un tombe dans cet horrible piège. Narrateur un mutex quand il commence à courir (ce qui est totalement non documenté, mais il semble fonctionner si vous avez besoin pour détecter le narrateur ms)

wstring m_wstrMutexKey = L"NarratorRunning"; 

// security attributes are part of windows API for CreateMutex 
LPSECURITY_ATTRIBUTES securityAttributes = new _SECURITY_ATTRIBUTES(); 
securityAttributes->bInheritHandle = false; 
securityAttributes->lpSecurityDescriptor = NULL; 
securityAttributes->nLength = sizeof(LPSECURITY_ATTRIBUTES); 

// initialize values 
bool isRunning = false; 

// CreateMutex returns a windows application HANDLE 
HANDLE m_applicationHandle = CreateMutex(securityAttributes, false, m_wstrMutexKey.c_str()); 

// This should never happen 
if (m_applicationHandle == NULL) { 
    isRunning = false; 
} 
// This condition indicates that narrator is running. 
if (GetLastError() == ERROR_ALREADY_EXISTS) { 
    isRunning = true; 
} 

if (isRunning) 
{ 
    cout<<"Narrator is running."; 
} else { 
    cout<<"No Mutex found. Narrator is not running."; 
} 

delete(securityAttributes);