2013-10-04 5 views
34

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

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

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

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

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

+6

Вы должны иметь задержку между нажатием и отпусканием. – Obicere

+0

@Obicere Я тоже пробовал, он тоже не работал. – ali

+0

Вы не можете сделать это через обычные каналы, специально, потому что это риск для безопасности. –

ответ

5

он работает в 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).

[добавлено позже после того, как он принял сегодня это решение] может потребоваться обмануть программу прослушивания, моделируя более плавное движение мыши. см. ответ здесь: How to move a mouse smoothly throughout the screen by using java?

3

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

37

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

Возможно, вы могли бы назвать имя программы, отклоняющей ваш клик?

+7

2 года спустя, и это все еще помогло мне. Спасибо за ваш вклад в этот сайт. – TheProWolfPcGames

9

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

+3

Это просто избавило меня от непогоды! Если бы запускать NetBeans как администратор -_- – Chris

+0

то же самое для автоматического щелчка мыши, который не работал, мне также пришлось запускать скрипт как администратор. – vchrizz

0

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

+0

У вас есть доказательства того, на какой ОС и как называется функция? Таким образом, вы могли бы предоставить читателям больше исследований в ваш комментарий! –

0

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

в au3 Script:

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

Теперь найти aut2exe в вашей au3 папке или найти 'Compile Script, чтобы .exe' в стартовое меню и создать исполняемый файл.

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

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

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

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

+0

Как использовать excel в AutoIT? Не могли бы вы объяснить, например, где указать путь excel, а также, если возможно, нажать на excel. –

Смежные вопросы