Как имитировать реальный щелчок мыши с помощью 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);
Вот проблема. Внешняя программа может обнаруживать, что этот клик генерируется компьютером, а не сгенерирован человеком, и, следовательно, его отказ от этого щелчка.
Я уже пробовал перемещать мышь там естественно, и это не имело никакого эффекта. Поэтому я предполагаю, что он должен прослушивать состояние клавиатуры или такое, и сообщать из этого, что щелчок генерируется компьютером.
Что мне нужно сделать, чтобы все состояния клавиатуры и мыши действовали так же, как обычный щелчок мыши?
Ответы
Ответ 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???