it-swarm.com.de

Wie simuliert man einen echten Mausklick mit Java?

Ich versuche, einen Mausklick in Java auszuführen, um in einem externen Programm auf etwas zu klicken. Dazu benutze ich Java.awt.robot und den folgenden Code:

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

Hier ist das Problem. Das externe Programm kann erkennen, dass dieser Klick vom Computer und nicht vom Menschen generiert wurde, und diesen Klick daher ablehnen.

Ich habe bereits versucht, die Maus dort natürlich zu bewegen, und das hatte keine Wirkung. Meine Vermutung ist also, dass der Tastaturstatus oder dergleichen abgehört werden muss und daraus hervorgeht, dass der Klick computergeneriert ist.

Was muss ich tun, um alle Tastatur-/Mauszustände so einzustellen, dass sie sich wie bei einem normalen Mausklick verhalten?

38
ali

Nun, ich hatte genau die gleichen Anforderungen, und die Roboterklasse ist für mich vollkommen in Ordnung. Es funktioniert unter Windows 7 und XP (probiert 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);
}

Könnten Sie vielleicht den Namen des Programms teilen, das Ihren Klick ablehnt?

55
AndyBaba

Zu Ihrer Information, in neueren Versionen von Windows gibt es eine neue Einstellung, bei der, wenn ein Programm im Administratormodus ausgeführt wird, ein anderes Programm, das sich nicht im Administratormodus befindet, keine Klicks oder anderen Eingabeereignisse an das Programm senden kann. Überprüfen Sie Ihr Quellprogramm, an das Sie den Klick senden möchten (Rechtsklick -> Eigenschaften), und prüfen Sie, ob das Kontrollkästchen "Als Administrator ausführen" aktiviert ist.

14
Click Upvote

es funktioniert unter Linux. Möglicherweise gibt es Systemeinstellungen, die in Windows geändert werden können, um dies zu ermöglichen.

[email protected]:/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);
 }
}

Ich gehe davon aus InputEvent.MOUSE_BUTTON1_DOWN in Ihrer Version von Java ist dasselbe wie InputEvent.BUTTON1_DOWN_MASK in meinem; Ich benutze 1.6.

andernfalls könnte dies Ihr Problem sein. Ich kann sagen, dass es funktioniert hat, weil mein Chrome) Browser für http://docs.Oracle.com/javase/7/docs/api/Java/awt/Robot.html geöffnet war als ich das Programm ausführte und es auf Debian.org änderte, weil dies der Link in der Lesezeichenleiste bei (100, 100) war.

[später hinzugefügt, nachdem ich heute darüber nachgedacht habe] Es könnte notwendig sein, das Hörprogramm durch die Simulation einer sanfteren Mausbewegung auszutricksen. Sehen Sie die Antwort hier: Wie bewegt man eine Maus mit Java reibungslos über den Bildschirm?

7
jcomeau_ictx

Bei allem Respekt ist es sehr wahrscheinlich, dass Sie sich irren, warum der Klick "abgelehnt" wird. Warum glaubst du, versucht ein Programm festzustellen, ob es ein Mensch ist oder nicht? Die Roboterklasse (hat sie häufig verwendet) sollte Nachrichten senden, die das Betriebssystem nicht von einem Benutzer unterscheiden kann, der den Klick ausführt.

4
user2080225

Sie können ein einfaches AutoIt-Skript erstellen, das die Aufgabe für Sie übernimmt, es als ausführbare Datei kompilieren und dort einen Systemaufruf ausführen.

in au3 Script:

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

Suchen Sie nun in Ihrem au3-Ordner nach aut2exe oder in Ihrem Startmenü nach "Compile Script to .exe" und erstellen Sie eine ausführbare Datei.

in Ihrem Java Klassenaufruf:

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

AutoIt verhält sich wie ein Mensch und wird nicht als Maschine erkannt.

Finden Sie AutoIt hier: https://www.autoitscript.com/

1

Einige Anwendungen erkennen möglicherweise eine Klickquelle auf niedriger Betriebssystemebene. Wenn Sie diese Art von Hack wirklich brauchen, können Sie einfach die Ziel-App im Fenster der virtuellen Maschine ausführen und Cliker im Host-Betriebssystem ausführen. Dies kann Abhilfe schaffen.

1
Taras