如何使用java模拟真实的鼠标点击?

如何使用java模拟真实的鼠标点击?,java,windows,Java,Windows,我试图在Java中执行鼠标单击,以在外部程序中单击某些内容。为此,我使用了java.awt.robot,以及以下代码: Robot bot = new Robot(); int mask = InputEvent.MOUSE_BUTTON1_DOWN; bot.mouseMove(x, y); bot.mousePress(mask); bot.mouseRelease(mask); 问题出在这里。外部程序能够检测到此点击是计算机生成的,而不是人为生成的,因此,

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

Robot bot = new Robot();
int mask = InputEvent.MOUSE_BUTTON1_DOWN;
bot.mouseMove(x, y);           
bot.mousePress(mask);     
bot.mouseRelease(mask);
问题出在这里。外部程序能够检测到此点击是计算机生成的,而不是人为生成的,因此,它会拒绝此点击

我已经尝试过自然移动鼠标,但没有任何效果。所以我的猜测是,它一定是在听键盘状态之类的,并由此判断,点击是由计算机生成的


我需要做什么才能将所有键盘/鼠标状态设置为与普通鼠标单击相同的方式?

它在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);
 }
}
我假设您的Java版本中的
InputEvent.MOUSE\u BUTTON1\u DOWN
与我的版本中的
InputEvent.BUTTON1\u DOWN\u MASK
相同;我用的是1.6

否则,这可能是你的问题。 我可以说它工作了,因为当我运行程序时,我的Chrome浏览器是打开的,它改为Debian.org,因为那是书签栏上的链接(100100)

[今天经过深思熟虑后添加]
可能有必要通过模拟更平滑的鼠标移动来欺骗收听程序。请参见此处的答案:

恕我直言,最有可能的是,您错误地理解了为什么单击会被“拒绝”。为什么你认为某个程序试图确定它是否是人类?Robot类(经常使用它)应该发送这样的消息,即操作系统无法区分执行单击的用户

我也有同样的要求,机器人课对我来说非常合适。它可以在Windows7和XP上运行(尝试了Java6和Java7)


您可以共享拒绝您单击的程序的名称吗?

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

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

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

在au3脚本中:

; how to use: MouseClick ( "button" [, x, y [, clicks = 1 [, speed = 10]]] )
MouseClick ( "left" , $CmdLine[1], $CmdLine[1] )
现在,在au3文件夹中找到AUT2 exe,或者在“开始”菜单中找到“将脚本编译为.exe”,并创建一个可执行文件

在Java类调用中:

Runtime.getRuntime().exec(
    new String[]{
        "yourscript.exe", 
        String.valueOf(mypoint.x),
        String.valueOf(mypoint.y)}
);
AutoIt的行为就像人一样,不会被检测为机器


在此处找到AutoIt:

在按下和释放之间应该有一个延迟。你不能故意通过正常通道这样做,因为这是一个安全风险。那么请告诉我必须使用的异常通道如何使用鼠标GUI宏记录器?@Boann可能是一些需要真实用户的软件。我的第一个赌注是在线扑克(或其他赌博)客户。这为我节省了大量的时间!必须以管理员身份运行NetBeans-u-对于无法运行的自动热键单击,我也必须以管理员身份运行脚本。我如何才能绕过它?哪个操作系统不关心它?UAC停用会有帮助吗?@miny1997仅在管理员模式下运行这两个程序应该可以工作。您是否有任何关于哪个操作系统以及如何调用该功能的证据?这样你就可以让读者对你的评论进行更多的研究!如何在AutoIT中使用excel?请您解释一下,比如在哪里提供excel路径,如果可能的话还可以单击excel。
Runtime.getRuntime().exec(
    new String[]{
        "yourscript.exe", 
        String.valueOf(mypoint.x),
        String.valueOf(mypoint.y)}
);