我尝试在Java中执行鼠标单击,单击外部程序中的某些内容。为此,我使用java.awt.robot
和以下代码:
Robot bot = new Robot();
int mask = InputEvent.MOUSE_BUTTON1_DOWN;
bot.mouseMove(x, y);
bot.mousePress(mask);
bot.mouseRelease(mask);
这就是问题所在。外部程序能够检测到此点击是由计算机生成的,而不是人为生成的,因此拒绝此点击。
我已经尝试过自然地移动鼠标,但没有任何效果。所以我的猜测是,它必须正在听键盘状态等,并告诉它,点击是由计算机生成的。
如何将所有键盘/鼠标状态设置为与正常鼠标点击相同的方式,我该怎么办?
答案 0 :(得分:54)
嗯,我有同样的要求,机器人类对我来说完全没问题。它适用于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);
}
您可以分享拒绝点击的程序名称吗?
答案 1 :(得分:14)
仅供参考,在较新版本的Windows中,有一个新设置,如果程序在管理员模式下运行,则另一个不在管理员模式下的程序无法向其发送任何点击或其他输入事件。检查您尝试发送点击的源程序(右键单击 - >属性),然后查看是否选中了“以管理员身份运行”复选框。
答案 2 :(得分:7)
它适用于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
与我的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 :(得分:4)
尽管如此,最可能的是你错误地认为点击被“拒绝”的原因。为什么你认为某个程序试图确定它是否是人类? Robot类(已经使用了很多)应该发送操作系统无法区分用户进行点击的消息。
答案 4 :(得分:1)
某些应用程序可能会在低操作系统级别检测到点击源。如果你真的需要那种黑客攻击,你可以在虚拟机的窗口中运行目标应用程序,并在主机操作系统中运行cliker,它可以提供帮助。
答案 5 :(得分: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/