如何使用java模拟真实的鼠标点击?
Posted
技术标签:
【中文标题】如何使用java模拟真实的鼠标点击?【英文标题】:How to simulate a real mouse click using java? 【发布时间】:2013-10-11 16:25:34 【问题描述】:我正在尝试在 Java 中执行鼠标单击,以单击外部程序中的某些内容。为此,我使用java.awt.robot
,以及以下代码:
Robot bot = new Robot();
int mask = InputEvent.MOUSE_BUTTON1_DOWN;
bot.mouseMove(x, y);
bot.mousePress(mask);
bot.mouseRelease(mask);
这就是问题所在。外部程序能够检测到此点击是计算机生成的而不是人为生成的,因此它会拒绝此点击。
我已经尝试过将鼠标自然移动到那里,但没有任何效果。所以我的猜测是,它一定是在听键盘状态之类的,并从中得知点击是计算机生成的。
我必须做些什么才能将所有键盘/鼠标状态设置为与正常鼠标单击相同的方式?
【问题讨论】:
你应该在按下和释放之间有一个延迟。 您不能通过正常渠道故意这样做 - 因为这是一个安全风险。 那请指导一下我必须使用的异常频道 鼠标GUI宏记录器是如何做到的? @Boann 可能是一些需要真人作为用户的软件。我的第一个赌注是在线扑克(或其他赌博)客户。 【参考方案1】:嗯,我也有同样的要求,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_DOWN_MASK);
bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
您可以分享拒绝您点击的程序的名称吗?
【讨论】:
【参考方案2】:仅供参考,在较新版本的 Windows 中,有一个新设置,如果一个程序在管理员模式下运行,那么另一个不在管理员模式下的程序将无法向其发送任何点击或其他输入事件。检查您尝试向其发送点击的源程序(右键单击 -> 属性),并查看是否选中了“以管理员身份运行”复选框。
【讨论】:
这为我节省了大量的故障排除时间!必须以管理员身份运行 NetBeans -_- 自动热键点击无效,我也必须以管理员身份运行脚本。 我该如何规避它?哪个操作系统不关心它?停用 UAC 会有帮助吗? @miny1997 只需在管理员模式下运行这两个程序即可【参考方案3】:它适用于 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_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?
【讨论】:
【参考方案4】:恕我直言,最有可能的是您对点击被“拒绝”的原因有误。为什么你认为某些程序试图确定它是否是人类? Robot 类(经常使用它)应该发送操作系统无法区分单击的用户的消息。
【讨论】:
【参考方案5】:某些应用程序可能会在低操作系统级别检测到点击源。如果你真的需要这种 hack,你可以在虚拟机窗口中运行目标应用程序,并在主机操作系统中运行 cliker,它会有所帮助。
【讨论】:
你有证据证明是哪个操作系统以及函数是如何调用的吗?这样您就可以让读者对您的评论进行更多研究!【参考方案6】:您可以创建一个简单的 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/
【讨论】:
如何在 AutoIT 中使用 excel?能否请您解释一下,比如在哪里提供 excel 路径,如果可能的话也可以点击 excel。以上是关于如何使用java模拟真实的鼠标点击?的主要内容,如果未能解决你的问题,请参考以下文章