8
votes

Simuler les clics de souris sur Mac OS X ne fonctionne pas pour certaines applications

J'écris une application pour Mac OS X 10.6 et plus tard en C ++. Une partie de l'application doit simuler des clics de mouvement et de souris de souris. Je le fais actuellement en postant des objets CGEvent à l'aide de cgenventpost (kcghideventtap, événement); . .

Cela fonctionne, pour la plupart - je peux simuler le mouvement de la souris et clique simplement bien, mais cela semble échouer dans certaines zones. Par exemple:

  • à Mozilla Firefox et Safari, je peux cliquer sur tous les menus, mais je ne peux pas cliquer sur un lien dans un site Web. Lorsque j'essaie, le lien est mis en surbrillance, mais le navigateur ne suit jamais le lien. Cependant, je peux cliquer avec le bouton droit de la souris sur un lien, sélectionnez "Ouvrir le lien dans nouvel onglet", et tout fonctionne comme prévu. résolu - Création de l'événement de la souris à l'aide de CGEventCreatemousevent (...) fait fonctionner l'événement dans le navigateur Web.
  • Je peux cliquer sur l'icône "Dashboard" pour blanchir le tableau de bord, mais je ne peux pas cliquer sur le bouton "I" de l'un des widgets de tableau de bord. De même, en cliquant sur l'un des résultats de la recherche du widget de recherche Spotlight ne fonctionne pas non plus.

    Cette incohérence est le long des limites des applications. Qu'est-ce qui pourrait être la cause?


0 commentaires

4 Réponses :


0
votes

Utilisez OSXVNC . Je vois qu'ils utilisent cgpostMousevent () au lieu de cgpostevent () .


5 commentaires

CGPostMousevent a été obsolète en 10.6. Merci à la suggestion, mais je préfère utiliser des fonctions obsolètes.


CGPostMousevent () a été remplacé par CGEventCreatemouseevent (). Pourquoi ne pas utiliser ça? développeur.apple.com/mac/library/documentation/carbon/referen CE / ...


Changer de CGEventCreate () à CGEventCreatemouseevent () a fixé le problème de Firefox - WHCIH est étrange, je définit les mêmes paramètres après tout, mais pas la question du tableau de bord.


... Peu importe la fonction que vous utilisez pour créer l'événement, vous devez toujours le poster avec CGPostevent () ...


La raison pour laquelle cela a fonctionné est que cgventCreate () définit l'état de clic sur 0 Toujours , alors que cgeventcreatemouseevent () le définit à 1 pour la souris vers le bas et 0 pour la souris. Donc il a fixé une partie du problème.



1
votes

La plupart des menus sont activés avec l'événement MouseDown. Les hyperliens sont suivis après l'événement MouseUp. Le bouton "I" ne fonctionne que lorsque la souris a été cliquée mais pas une longue période. Tout cela semble montrer que vous avez un problème de synchronisation, essayez plusieurs timings pressés.


2 commentaires

Cela ressemble à un plomb prometteur. J'ai juste chronométré l'écart entre l'envoi des événements de la souris et de la souris - un clic typique prend 42 ms, ce qui me semble être suffisamment court pour générer un événement de clic plutôt qu'un simple clic ou autre ...


En effet, ce n'est pas un problème de synchronisation. Tant que vous définissez le nombre de clics, tout chronométrage raisonnable fera.



7
votes

Ce que vous devez faire pour convaincre ces applications que vous avez en fait généré un clic est pour définir explicitement la valeur du champ "Cliquez sur l'état" de l'événement de la souris sur 1 (IT par défaut à 0). Le code suivant le fera:

CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1);


0 commentaires

0
votes

0 commentaires