Précédent   Forum des professionnels en informatique > Général Développement > Programmation système > Windows
Windows Forum d'entraide sur la programmation Windows. Tutoriel API Windows
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/01/2012, 10h00   #1
Nouveau Membre du Club
 
Inscription : février 2008
Messages : 28
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 28
Points : 37
Points : 37
Par défaut Problème avec SetCursorPos et IAccessible

Bonjour, et bonne année

Je souhaite faire un programme en C++ qui fait bouger la souris et qui peut être utiliser avec un lecteur d'écran (NVDA pour être précis).

Le lecteur d'écran utilise les fonctions de IAccessible pour lire l'élément qui a le focus, j'ai essayer de faire bouger la souris avec toutes les fonctions que j'ai pu trouver (mouse_event, sendMessage, SetCursorPos ...) mais le lecteur d'écran ne me détecte pas les évènements (surtout le "STATE_SYSTEM_FOCUSABLE"). J'ai aussi essayer les fonctions de focus (setFocus ...) mais rien ne change. Je précise aussi que la fonction windows qui permet de faire bouger la souris avec le pavé numérique est très bien détecter pas le lecteur (donc c'est théoriquement possible de le faire)

Je recherche donc une fonction pour faire bouger la souris qui sera détecter avec IAccessible.


J'ai comme idée de récupérer le curseur système (récupérer l'ID ne doit pas être un problème) et le faire bouger (là par contre j'ai aucune idée de comment faire).

Si vous avez une idée de comment faire (ou tout autre technique) je suis preneur.

Edit : le programme fonctionne avec le lecteur d'écran de Microsoft, mais je cherche quand même un moyen de le faire fonctionner avec NVDA en lecteur d'écran car il est mieux conçu.
webpsi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 16h10   #2
Modérateur
 
Avatar de Andnotor
 
Inscription : septembre 2008
Messages : 2 232
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 2 232
Points : 2 904
Points : 2 904
SetFocus ne fonctionnera pas puisque tu n'es pas dans le thread cible. Il faudrait d'abord utiliser AttachThreadInput.
Quant aux mouvements souris, il n'y aucune raison qu'il génère un événement IAccessible puisque ça ne concerne pas un élément UI. Ton soft intercepte peut-être les mouvements par hook et récupère l'élément sous la souris tout en ignorant ceux injectés.
Bref, avec Mouse_Event, envois un click gauche après le déplacement et tu devrais retomber sur tes pieds
Andnotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 16h25   #3
Nouveau Membre du Club
 
Inscription : février 2008
Messages : 28
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 28
Points : 37
Points : 37
Le "mouse_event(MOUSEEVENTF_LEFTDOWN,_point.x,_point.y,0,0);" ne fonctionne pas : ça clic ... et c'est un problème quand on est au dessus d'une icône ou autre chose (ça ne fonctionne pas non plus avec MOUSEEVENTF_LEFTUP).

Par contre quand je clic ça fonctionne, mais comme ça génère un évènement UI c'est normal.

En attendant d'avoir d'autres réponses je vais aller voir dans le code source de NVDA s'il y a un moyen de ne pas ignoré les mouvements de souris injecté.

Edit : J'avance, je viens de voir qu'il est possible d'envoyer des évènements de focus avec IAccessible (ça marche pas encore bien mais c'est un début et cette fois NVDA récupère les évènements).
webpsi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 09h48   #4
Nouveau Membre du Club
 
Inscription : février 2008
Messages : 28
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 28
Points : 37
Points : 37
Finalement le problème est réglé, c'était bien NVDA qui bloqué les évènements simuler, j'ai donc modifier et recompiler le code et maintenant ça fonctionne.

Si quelqu'un a le même problème que moi : dans le fichier mouseHandler.py, il y a une fonction internal_mouseEvent(msg,x,y,injected), il faut supprimer le "if injected return true".
webpsi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2012, 08h31   #5
Invité de passage
 
Inscription : octobre 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 7
Points : 2
Points : 2
Envoyer un message via MSN à cs_maheox
Désolé de remonter ce sujet de .... 4 ans xD mais google pert la notion du temps des fois.

Voila je réponds parce que j'ai exactement le même problème mais avec une autre application. Seulement je ne peu pas décompiler le code et farfouiller pour trouver oû ils bloquent ça.

Je voulais tout simplement savor s'il y avais un moyen de 'bloquer' la non réception de message simulés ou tout simplement de passer au dessus cette ignorance.

J'ai un clavier G110 (bien utile pour les macros etc..) qui me permet de simuler un clic lors de l'appui sur une touche programmable. Et lorsque je le fait de la sorte, le clic à bien lieu.

Les pilotes de ce claviers sont bien obligés de passer par une simulation de clic ou un truc dans le genre non ?

Merci

Cordialement.
cs_maheox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2012, 17h15   #6
Modérateur
 
Avatar de Andnotor
 
Inscription : septembre 2008
Messages : 2 232
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 2 232
Points : 2 904
Points : 2 904
3 janvier 2012... Faut pas exagérer non plus

Non, tu ne peux pas modifier ce flag. Mais si la macro de ton clavier est correctement exécutée c'est que tu as une erreur dans ton code !
Andnotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h50.


 
 
 
 
Partenaires

Hébergement Web