Подтвердить что ты не робот

Как имитировать реальный щелчок мыши с помощью java?

Я пытаюсь выполнить щелчок мышью на Java, чтобы щелкнуть что-то во внешней программе. Для этого я использую java.awt.robot и следующий код:

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

Вот проблема. Внешняя программа может обнаруживать, что этот клик генерируется компьютером, а не сгенерирован человеком, и, следовательно, его отказ от этого щелчка.

Я уже пробовал перемещать мышь там естественно, и это не имело никакого эффекта. Поэтому я предполагаю, что он должен прослушивать состояние клавиатуры или такое, и сообщать из этого, что щелчок генерируется компьютером.

Что мне нужно сделать, чтобы все состояния клавиатуры и мыши действовали так же, как обычный щелчок мыши?

4b9b3361

Ответ 1

Ну, у меня было точно такое же требование, и класс Робот для меня вполне подходит. Он работает на Windows 7 и XP (пробовал 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);
}

Может быть, вы могли бы поделиться названием программы, которая отклоняет ваш клик?

Ответ 2

FYI, в новых версиях Windows, есть новый параметр, где, если программа запущена в режиме администратора, другая программа, не находящаяся в режиме администратора, не может отправлять ему клики или другие входные события. Проверьте исходную программу, на которую вы пытаетесь отправить клик (щелкните правой кнопкой мыши → свойства), и проверьте, установлен ли флажок "запускать как администратора".

Ответ 3

он работает в Linux. возможно, есть системные настройки, которые можно изменить в Windows, чтобы это разрешить.

[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);
 }
}

Я предполагаю, что InputEvent.MOUSE_BUTTON1_DOWN в вашей версии Java - это то же самое, что и InputEvent.BUTTON1_DOWN_MASK в моей; Я использую 1.6.

В противном случае это может быть вашей проблемой. Я могу сказать, что это сработало, потому что мой браузер Chrome был открыт для http://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html, когда я запускал программу, и он изменился на Debian.org, потому что это была ссылкой в ​​панели закладок (100, 100).

[добавлен позже после того, как он сегодня называет его] может потребоваться обмануть программу прослушивания, моделируя более плавное движение мыши. см. ответ здесь: Как плавно перемещать мышь по экрану с помощью java?

Ответ 4

При всем уважении, скорее всего, вы ошибаетесь в том, почему клик "отклонен". Почему, по вашему мнению, какая-то программа пытается определить, является ли это человеком или нет? Класс Robot (он много использовал) должен отправлять сообщения, которые операционная система не имеет возможности отличить от пользователя, делающего клик.

Ответ 5

Некоторые приложения могут обнаруживать источник щелчка на низком уровне ОС. Если вам действительно нужен такой хак, вы можете запустить целевое приложение в окне виртуальной машины и запустить кликер в ОС хоста, это может помочь.

Ответ 6

Вы можете создать простой AutoIt Script, который выполняет задание для вас, скомпилировать его как исполняемый файл и выполнить там системный вызов.

в au3 Script:

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

Теперь найдите aut2exe в своей папке au3 или найдите "Компилировать Script в .exe" в меню "Пуск" и создайте исполняемый файл.

в вызове класса Java:

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

AutoIt будет вести себя так, как если бы он был человеком, и не будет обнаружен как машина.

Найти AutoIt здесь: https://www.autoitscript.com/

Ответ 7

Это был Перфетчич. Drag N Drop Robot Java закончен !!!

public static void click(int y , int x,int y2, int x2) throws AWTException, InterruptedException{
    Robot bot = new Robot();
    bot.mouseMove(x, y);    
    bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
    Thread.sleep(777);//Здесь можно уравнение прямой проходящее через 2   
    //точки!!!
    bot.mouseMove(x2, y2);
    bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
}

А как насчет Android???