53

我正在尝试在 Java 中执行鼠标单击,以单击外部程序中的某些内容。为此,我使用java.awt.robot, 和以下代码:

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

这就是问题所在。外部程序能够检测到此点击是计算机生成的而不是人为生成的,因此它会拒绝此点击。

我已经尝试过自然地将鼠标移到那里,但没有任何效果。所以我的猜测是,它一定是在听键盘状态之类的,并从中看出,点击是计算机生成的。

我必须做什么才能将所有键盘/鼠标状态设置为与正常鼠标单击相同的方式?

4

6 回答 6

67

好吧,我有同样的确切要求,机器人课对我来说非常好。它适用于 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);
}

您是否可以分享拒绝您点击的程序的名称?

于 2013-10-10T12:43:10.317 回答
24

仅供参考,在较新版本的 Windows 中,有一个新设置,如果一个程序在管理员模式下运行,那么另一个不在管理员模式下的程序不能向它发送任何点击或其他输入事件。检查您尝试向其发送单击的源程序(右键单击-> 属性),并查看是否选中了“以管理员身份运行”复选框。

于 2013-10-21T01:57:34.257 回答
11

它适用于Linux。也许有一些系统设置可以在 Windows 中更改以允许它。

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

我假设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 在整个屏幕上平滑移动鼠标?

于 2013-10-05T08:03:00.630 回答
4

恕我直言,最有可能的是您对点击被“拒绝”的原因弄错了。为什么你认为某些程序试图确定它是否是人类?Robot 类(经常使用它)应该发送操作系统无法区分点击的用户的消息。

于 2013-10-10T00:56:07.300 回答
1

某些应用程序可能会在低操作系统级别检测到点击源。如果您真的需要这种 hack,您可以在虚拟机窗口中运行目标应用程序,并在主机操作系统中运行 cliker,它会有所帮助。

于 2014-11-23T01:17:44.627 回答
1

您可以创建一个简单的 AutoIt 脚本来为您完成这项工作,将其编译为可执行文件并在那里执行系统调用。

在 au3 脚本中:

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

现在在您的 au3 文件夹中找到 aut2exe,或者在您的开始菜单中找到“将脚本编译为 .exe”并创建一个可执行文件。

在您的 Java 类调用中:

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

AutoIt 的行为就像是人一样,不会被检测为机器。

在这里找到 AutoIt:https ://www.autoitscript.com/

于 2016-06-03T16:45:51.627 回答