NSEvent et le clic de souris...
iShadow
Membre
Bonjour !
Je voudrais savoir comment simuler un clic de souris sur n'importe quelle zone de l'écran...
En regardant la doc Apple sur NSEvent, je vois cette methode :
Je suppose donc que c'est celle qui qui va m'aider...
Voici le code que j'ai testé :
Mais celui-ci n'a pas l'air de bien marcher... D'où mon topic.
En effet, que dois-je faire ? Est-ce-que il faut "lancer" l'Event ou cette méthode l'exécute automatiquement... De plus, dans la doc Apple, je vois ces arguments : timestamp et eventNumber, mais je n'arrive pas à comprendre à quoi ils servent...
Enfin, je veux spécifier dans windowNumber, non pas une fenetre spéciale, mais tout l'écran... Que faire ?
Merci d'avance
Je voudrais savoir comment simuler un clic de souris sur n'importe quelle zone de l'écran...
En regardant la doc Apple sur NSEvent, je vois cette methode :
+ (NSEvent *)mouseEventWithType:(NSEventType)type location:(NSPoint)location modifierFlags:(unsigned int)flags timestamp:(NSTimeInterval)time windowNumber:(int)windowNum context:(NSGraphicsContext *)context eventNumber:(int)eventNumber clickCount:(int)clickNumber pressure:(float)pressure
Je suppose donc que c'est celle qui qui va m'aider...
Voici le code que j'ai testé :
NSPoint tempPoint;<br /> tempPoint.x = 100;<br /> tempPoint.y = 50;<br /> NSEvent *tempEvent = [NSEvent mouseEventWithType:NSLeftMouseDown location:tempPoint modifierFlags:nil timestamp:1.0 windowNumber:1 context:nil eventNumber:1 clickCount:1 pressure:1.0];
Mais celui-ci n'a pas l'air de bien marcher... D'où mon topic.
En effet, que dois-je faire ? Est-ce-que il faut "lancer" l'Event ou cette méthode l'exécute automatiquement... De plus, dans la doc Apple, je vois ces arguments : timestamp et eventNumber, mais je n'arrive pas à comprendre à quoi ils servent...
Enfin, je veux spécifier dans windowNumber, non pas une fenetre spéciale, mais tout l'écran... Que faire ?
Merci d'avance
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
C'est juste un wrapper pour encapsuler toutes les données relatives à l'event
(c'est un peu comme une struct en C si tu veux, si je peux me permettre la comparaison un peu poussive)
Donc en gros c'est bien beau tu as créé ton NSEvent, mais maintenant il faut l'envoyer à un objet !
Maintenant à savoir lequel et comment, je te laisse chercher
Je comprend ce que représente à présent un NSEvent en tant que conteneur... Mais pour l'envoyer à un objet... Quel type d'objet d'abord, en fait ? Tout ce que je veux faire, c'est pouvoir simuler un clic de souris à un endroit précis de l'écran... Que dois-je faire dans ce cas-là ?
Laisse ton appli gérer (et dispatcher) ton événement :
.
Par exemple, je m'attends à ce que une fenêtre autre que celle de l'app se mettre au premier plan... Comme si je cliquait réellement avec ma souris n'importe où sur l'écran, ailleurs que sur la fenêtre déjà au premier plan. Mais rien ne se passe...
Alors je pense à un truc : est ce que cela vient du fait que j'ai spécifié windowNumber à 1 ? Je veux dire que cela clique au coordonnées {100;50} dans le référentiel de cette window ? (j'ai mis un au pif en fait, car je sais pas quoi mettre...)
(J'espère que je suis assez compréhensible lol ! C'est assez dur à expliquer )
- tu envoies l'event à NSApp, qui est ton application. C'est alors ton application qui va recevoir et gérer l'event. Si l'event est en dehors de l'appli (enfin plus exactement elle va se charger de passer l'event à ses fenêtres et autres enfants de la responderChain et si personne ne répond parce que y'a personne appartenant à NSApp sous ton clic) alros l'appli ne fait rien. C'est ensuite l'OS qui gère le clic.
En fait si je ne me trompe pas l'ordre de réception de l'event lorsque tu cliques c'est OS --> Appli --> Fenêtre, donc forcément si tu envoies ton event à NSApp, y'a pas de fenêtre sous ton clic simulé, ça fait rien et l'OS n'a pas reçu l'event donc change pas d'appli non plus.
- Tes coordonnées ne sont peut-être pas dans le bon référenciel, et là parfois surtout dans ton cas c'est peut-être un peu casse gueule pour trouver lequel utiliser...
Pourquoi tu n'utiliserais pas un petit coup d'AppleScript ou même plus adapté, un AppleEvent ?
Par exemple, si tu veux simplement activer une autre application, NSWorkspace fait ça très bien...
En fait, le seul usage que je vois est un 'dispositif' pour l'accès universel, et il y a des API spécifiques pour cela.
Je vais essayer de creer un logiciel qui va reconnaitre certains éléments de l'interface puis cliquer dessus... Ce seront des éléments connus par le programme et c'est TRES spécifique à ce que je veux faire (en gros c'est pas du tout une app que je compte diffuser, à moins qu'on me le demande lol).
En gros, je vais connaà®tre la position d'un élément de l'interface, et je veux demander à ce logiciel de cliquer dessus de multiples fois...
[EDIT] : voici plus de précisions : je joue à World of Warcraft, et je voudrais juste qu'un logiciel tourne en tache de fond et vérifie constamment l'état de la jauge de vie, et si il voit qu'elle presque vide, il clique alors sur une potion MDR... Cela m'évite de me faire tuer quand je ne suis pas devant l'ordi... :brule:
Si ce que tu dois faire ne concerne qu'un nombre limité d'actions, il est nettement plus simple de passer par AppleScript pour commander l'action directement.
[EDIT] : c'est farfelu, je sais
En tout cas, la réponse à cette question est hors cocoa.
En quoi est-ce hors Cocoa ? Le but de l'application, on s'en fout lol, je voulais juste savoir comment contrôler OS X et simuler un clic de souris... Et c'était tant pour le logiciel, que je ne pense même pas être en mesure de programmer, vu mon niveau actuel ^^, que pour mes connaissances personnelles. En tout cas, je comprend que vous préfériez ne pas m'aider car le but de cette application peut porter à confusion, et je m'en excuse. Merci quand même de m'avoir donné quelques éléments de réponse, cela me sera utile pour mes futurs programmes
Mais en tout cas, ça peut te donner un avantage dans certains cas, genre si tu oublies de le débrancher dans une bataille .
Quant au but de l'application, comme tu dis, il importe peu. Simplement:
1. il nous faut des données pour aider efficacement. Les jeux utilisent souvent des bibliothèques spéciales pour la gestion des événements, ce qu'on aurait pu te proposer n'aurait alors servi à rien. Ce n'est donc pas dans Cocoa que tu trouveras la réponse à cette question.
2. Comme tu le dis, tu es encore débutant et sur cette base, tu peux te tromper dans tes choix techniques pour arriver à un résultat. Le but de ma question était de voir si un autre choix technique n'était pas envisageable, rien de plus.
Sinon, en fait, je pensait que ce n'était pas la peine de s'intéresser à tout ce qui touche au jeu en lui-même, puisqu'en fait le programme ne ferait que prendre des screenshots et exécuter une même action à la souris ; en fait, il pourrait aussi bien tourner sans le jeu ouvert (enfin... il n'y aurait aucun intérêt et ca foutrait le bordel ^^).
Sinon, si on en revient au sujet, en oubliant totalement ce projet qui n'aurais jamais été abouti vu mes compétences de toute façon, vers quel "environnement" envoyer cet event si on veut qu'il s'exécute sur le système en entier et non pas seulement dans l'app en elle-même ?
Mais attention au spyware "The Warden", qui surveille tout les processus, pourrait mal considérer ce petit bout de programme, et amener au blocage de ton compte...
Mais c'est toujours intéressant d'en apprendre un peu plus sur le système !
En tout cas un grand merci pour votre aide
je voudrais savoir ou en est ton projet parce que étant archidébutant j'ai beaucoup de mal à élaguer les doc et ton projet de clique m'interresse.
je me demande aussi comment faire pour simuler l'appuie d'une touche de clavier, un peu comme fait le " visualisateur de clavier"
avez vous une idée de comment faire ça en C sinon ?
en tous cas merci, il ne reste plus qu'à réussir à m'en servir pour me faire la main
Dans tout les cas, tu n'as plus qu'à offrir ta tournée générale, car chercher dans les bottes de foins ça donne soif. :P
je sais pas encore si j'irai ni quel jour j'irai mais je checkerai mes mails de là bas !
j'essaie d'utiliser les fonctions CGEventCreateKeyboardEvent (pour simuler l'appui d'une touche) et CGPostEvent (pour poster l'event).
seulement je patine et je ne comprend pas pourquoi.
avec le code suivant je suis censé me créer un keyboard event, ça a pas l'air sorcier,
pourtant à l'execution quand je click le bouton le programme bloque et le debugger de Xcode s'ouvre car quelque chose ne va pas dans l'instruction (l'appel plutôt) de
est-ce à cause d'un appel de fonction carbon depuis une app cocoa ? ou quelque chose dans ce genre là ?
Merci, si vous y comprenez quelque chose
Je n'y connais pas encore grand chose en cocoa, mais généralement le compilateur refuse de compiler si on a pas inclus le fichier qui défini la fonction, et dans mon cas le compilateur ne dit rien.
Donc que faut il en penser ?
Voici un code fonctionnel :
[tt]
CGEventSourceRef eventSource=CGEventSourceCreate(kCGEventSourceStatePrivate);
CGEventRef downEvt=CGEventCreateKeyboardEvent(eventSource,(CGKeyCode)6,true);
CGEventRef upEvt=CGEventCreateKeyboardEvent(eventSource,(CGKeyCode)6,false);
CGEventPost(kCGSessionEventTap,downEvt);
CGEventPost(kCGSessionEventTap,upEvt);
CFRelease(downEvt);
CFRelease(upEvt);
[/tt]
je suis content là ,j'ai appris du concret.
mais c'est dommage que la doc ne reflète pas la réalité, en effet je pensais que nul était une valeur accepté.
merci tout plein !