web-dev-qa-db-fra.com

Comment simuler un vrai clic de souris en utilisant java?

J'essaie de faire un clic de souris en Java, de cliquer sur quelque chose dans un programme externe. Pour ce faire, j'utilise Java.awt.robot, et le code suivant:

Robot bot = new Robot();
int mask = InputEvent.MOUSE_BUTTON1_DOWN;
bot.mouseMove(x, y);           
bot.mousePress(mask);     
bot.mouseRelease(mask);

Voici le problème. Le programme externe est capable de détecter que ce clic est généré par l'ordinateur et non par l'homme, et par conséquent, il rejette ce clic.

J'ai déjà essayé de déplacer la souris naturellement et cela n'a eu aucun effet. Donc, je suppose qu’il faut écouter l’état du clavier ou autre, et en déduire que le clic est généré par l’ordinateur.

Que dois-je faire pour que tous les états du clavier/souris agissent de la même manière qu’un clic de souris normal?

38
ali

Eh bien, j’avais exactement les mêmes exigences et la classe Robot me convient parfaitement. Cela fonctionne sur Windows 7 et XP (essayé Java 6 & 7).

public static void click(int x, int y) throws AWTException{
    Robot bot = new Robot();
    bot.mouseMove(x, y);    
    bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
    bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
}

Peut-être pourriez-vous partager le nom du programme qui refuse votre clic?

55
AndyBaba

Pour votre information, dans les versions plus récentes de Windows, il existe un nouveau paramètre dans lequel, si un programme est exécuté en mode administrateur, un autre programme qui n'est pas en mode administrateur ne peut lui envoyer aucun clic ou autre événement d'entrée. Vérifiez le programme source auquel vous essayez d'envoyer le clic (clic droit -> propriétés) et vérifiez si la case à cocher "Exécuter en tant qu'administrateur" est cochée.

14
Click Upvote

cela fonctionne sous Linux. peut-être y at-il des paramètres système qui peuvent être modifiés dans Windows pour l’autoriser.

jcomeau@aspire:/tmp$ cat test.Java; javac test.Java; Java test
import Java.awt.event.*;
import Java.awt.Robot;
public class test {
 public static void main(String args[]) {
  Robot bot = null;
  try {
   bot = new Robot();
  } catch (Exception failed) {
   System.err.println("Failed instantiating Robot: " + failed);
  }
  int mask = InputEvent.BUTTON1_DOWN_MASK;
  bot.mouseMove(100, 100);
  bot.mousePress(mask);
  bot.mouseRelease(mask);
 }
}

Je suppose que InputEvent.MOUSE_BUTTON1_DOWN Dans votre version de Java est identique à InputEvent.BUTTON1_DOWN_MASK Dans la mienne; J'utilise 1.6.

sinon, cela pourrait être votre problème. Je peux dire que cela a fonctionné parce que mon navigateur Chrome était ouvert à http://docs.Oracle.com/javase/7/docs/api/Java/awt/Robot.html quand je Le programme a été lancé et il a été remplacé par Debian.org car c’était le lien dans la barre de favoris à (100, 100).

[ajouté plus tard après y avoir réfléchi aujourd’hui], il pourrait être nécessaire de tromper le programme d’écoute en simulant un mouvement de souris plus doux. Voir la réponse ici: Comment déplacer une souris en douceur sur tout l'écran en utilisant Java?

7
jcomeau_ictx

Avec tout le respect que je vous dois, la chose la plus probable est que vous vous trompez sur la raison pour laquelle le clic est "rejeté". Pourquoi pensez-vous qu'un programme tente de déterminer s'il est humain ou non? La classe Robot (qui l’a beaucoup utilisée) devrait envoyer des messages indiquant que le système d’exploitation n’a aucun moyen de le distinguer d’un utilisateur qui clique.

4
user2080225

Vous pouvez créer un script AutoIt simple qui effectue le travail pour vous, le compiler en tant qu'exécutable et y effectuer un appel système.

dans script au3:

; how to use: MouseClick ( "button" [, x, y [, clicks = 1 [, speed = 10]]] )
MouseClick ( "left" , $CmdLine[1], $CmdLine[1] )

Maintenant, trouvez aut2exe dans votre dossier au3 ou recherchez 'Compile Script to .exe' dans votre menu Démarrer et créez un exécutable.

dans votre Java:

Runtime.getRuntime().exec(
    new String[]{
        "yourscript.exe", 
        String.valueOf(mypoint.x),
        String.valueOf(mypoint.y)}
);

AutoIt se comportera comme s'il s'agissait d'un humain et ne sera pas détecté comme une machine.

Trouvez AutoIt ici: https://www.autoitscript.com/

1

Certaines applications peuvent détecter une source de clics à un niveau de système d'exploitation faible. Si vous avez vraiment besoin de ce type de piratage, vous pouvez simplement exécuter l'application cible dans la fenêtre de la machine virtuelle et exécuter cliker dans Host OS, cela peut aider.

1
Taras