如何模拟使用java的真正的鼠标点击?
我正在尝试在Java中执行鼠标单击,以在外部程序中单击一些内容。 为此,我使用java.awt.robot
和下面的代码:
Robot bot = new Robot(); int mask = InputEvent.MOUSE_BUTTON1_DOWN; bot.mouseMove(x, y); bot.mousePress(mask); bot.mouseRelease(mask);
这是问题。 外部程序能够检测到这个点击是计算机生成的而不是人为生成的,因此它拒绝了这个点击。
我已经尝试将鼠标自然地移动,并没有任何效果。 所以我的猜测是,它必须听取键盘状态或类似的信息,并从中说明点击是由计算机生成的。
我需要做些什么来设置所有的键盘/鼠标状态的行为与正常的鼠标点击一样?
那么我有相同的确切要求,机器人class对我来说是完全正确的。 它适用于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); }
也许你可以分享拒绝点击的程序的名称?
仅供参考,在较新版本的Windows中,如果程序在Adminstrator模式下运行,则另一个未处于pipe理员模式的程序不能发送任何点击或其他input事件。 检查您尝试发送点击的源程序(右键单击 – >属性),然后查看是否选中“以pipe理员身份运行”checkbox。
它在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.BUTTON1_DOWN_MASK
与我的InputEvent.BUTTON1_DOWN_MASK
是一样的; 我正在使用1.6。
否则,这可能是你的问题。 我可以告诉它工作,因为我的Chrome浏览器打开到http://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html当我运行该程序,并更改为Debian.org因为这是(100,100)书签栏中的链接。;
[在今天认识之后join],可能有必要通过模拟更平滑的鼠标移动来欺骗聆听程序。 在这里看到答案: 如何通过使用Java在整个屏幕上平滑移动鼠标?
在所有方面最可能的是,你是错误的为什么点击被“拒绝”。 你为什么认为某个程序正在试图确定它是否是人类? Robot类(已经使用了很多)应该发送操作系统无法区分的用户进行点击的消息。
某些应用程序可能会在低OS级别检测点击源 如果你真的需要这种破解,你可以在虚拟机的窗口中运行目标应用程序,并在主机操作系统上运行cliker,它可以提供帮助。
您可以创build一个简单的AutoIt脚本来为您完成这项工作,将其编译为可执行文件并在那里执行系统调用。
在au3脚本中:
; how to use: MouseClick ( "button" [, x, y [, clicks = 1 [, speed = 10]]] ) MouseClick ( "left" , $CmdLine[1], $CmdLine[1] )
现在在你的au3文件夹中findaut2exe,或者在你的开始菜单中find“编译脚本到.exe”,并创build一个可执行文件。
在你的Java类调用中:
Runtime.getRuntime().exec( new String[]{ "yourscript.exe", String.valueOf(mypoint.x), String.valueOf(mypoint.y)} );
AutoIt的行为就像是一个人,不会被检测为一台机器。
在这里findAutoIt: https : //www.autoitscript.com/