解放双手的Robot类(-JAVA)

解放双手的Robot类(-JAVA)

以下文章是介绍JAVA中Robot类,Robot的主要目的是为了方便Java平台实现的自动化测试。其可实现自动操作鼠标和键盘。这就可以实现许多骚操作例如:游戏的外挂、等。

Robot类的实现


首先生成一个Robot的对象,用这个对象的方法来操作键盘和鼠标。
Robot robot = new Robot();

接下来是 按键,通过两个方法实现按下一个按键。
robot.keyPress(int keycode);
robot.keyRelease(int keycode);

其中int keycode就是你想要按键。你可以取KeyEvent类中静态变量,如下表中常用的按键值:(你也可以查看API文档了解更多按键值)
在这里插入图片描述
如果想要按下A按键可以写成:

robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);

为什么是两个方法才实现按下一个按键呢?
因为按下一个按键分两步:一按下这个按键(将手指按下不动),二抬起这个按键(将手指抬起)。
知道了这一点,你能否想到一些常规操作如:

robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_ALT);

上述代码为切换窗口,你可以自己试试。

在这里插入图片描述


接下来是鼠标,通过下面几个方法来实现鼠标的移动、单击、滑轮操作。首先 是鼠标的移动:将鼠标指针移动到给定的屏幕坐标。
mouseMove(int x, int y) //移动鼠标

屏幕的坐标,取决于你的屏幕分辨率例如:

在这里插入图片描述
图中的分辨率为1920 x 1080。那X、Y就在这个范围取值即可。例如将鼠标移动到坐标为400,500的位置:

robot.mouseMove(400, 500)

然而有时候,你会发现鼠标移动后的位置,不是在400、500的位置。
那是因为,你没将更改应用和项目文本的大小设置为:100%。如图:
在这里插入图片描述
但是解决了这一点后,还是可能出问题。我将在最后提及并提出解决方法。


单击鼠标:通过下面的语句实现。与按键的实现一样。
mousePress(int buttons)
mouseRelease(int buttons)

按下和抬起鼠标的左右键,int buttons参数为按键,键值如图:
在这里插入图片描述
如果想要单击一次左键:

robot.mousePress(KeyEvent.BUTTON1_MASK);
robot.mouseRelease(KeyEvent.BUTTON1_MASK);

那如果想要长按左键(按住左键不放),或者是连击5次左键。想一想,你知道怎做了吗?
在这里插入图片描述


鼠标滑轮的滚动
mouseWheel(int wheelAmt)

其中int wheelAmt参数的取值为正整数时,为将页面向上拖动,查看下面内容;当为负整数时,为将页面向下拖动,查看上面内容。取值 1 为滚动一个刻度值,取值 2 为滚两个刻度值。刻度值:具体滚多滚少,要看你的电脑,中的滑轮设置


获得坐标颜色:返回给定屏幕坐标处的像素颜色。
public Color getPixelColor(int x, int y)

例如获得坐标为500、40的颜色:

Color color = robot.getPixelColor(500, 400);

注意:要创建一个Color对象来接受返回的值。否则你将一无所获。


那这个方法有什么用呢?其实可以用这个方法来判断页面是否刷新。进而进行下一步操作。


休眠几秒:即在停止操作一段时间。
public void delay(int ms)  
//ms - 以毫秒为单位的睡眠时间         
//1s = 1000ms。

在日常操作中,你几乎是不可能连续按下几个按键
如按下A、B、C、D按键:

robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
robot.keyPress(KeyEvent.VK_B);
robot.keyRelease(KeyEvent.VK_B);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyPress(KeyEvent.VK_D);
robot.keyRelease(KeyEvent.VK_D);

上述操作按下与释放按键之间几乎不存在延时、停顿,与人的正常操作几乎不相符。那我们就可以用delay方法模拟出人的操作,如下:

robot.keyPress(KeyEvent.VK_A);
robot.delay(100);
robot.keyRelease(KeyEvent.VK_A);
robot.delay(500);
robot.keyPress(KeyEvent.VK_B);
robot.delay(100);
robot.keyRelease(KeyEvent.VK_B);
robot.delay(500);
robot.keyPress(KeyEvent.VK_C);
robot.delay(100);
robot.keyRelease(KeyEvent.VK_C);
robot.delay(500);
robot.keyPress(KeyEvent.VK_D);
robot.delay(100);
robot.keyRelease(KeyEvent.VK_D);

最后的问题


关于如何获得想要的坐标:

可用下面代码在后台输出;先延时3秒,在3秒内将鼠标放置在你想要获得坐标的位置;后台就会输出结果。

robot.delay(3000);
Point point = MouseInfo.getPointerInfo().getLocation();
System.out.println(point);

例如:java.awt.Point[x=800,y=450]


关于mouseMove的问题:

将更改应用和项目文本的大小设置为:100%。如图:
在这里插入图片描述
但有时候,仍然会出现错误。移动到的位置并不是你想要的位置,你写的语句也并没有错,但是它就是不按照你的想法来。
例如:

robot.mouseMove(800, 450);

语句没错但是结果就是错了,我在查了许多资料后找到一种方法:加个循环,重复多次后精准定位。

例如:

for (int i = 0; i < 10; i++) {
   robot.mouseMove(800, 450);  
}

关于延时delay取值:

用于游戏挂机的Robot最好是用到下面的随机数,若延时的时间间隔每次都相同,很容易被游戏开发商认为是外挂脚本。容易被警告,甚至被封号。

// 设置随机数
double a = random.nextDouble();
a = 0.2 + a*(0.4-0.2);
int b = (int)(a*1000);
System.out.println(b);
robot.delay(b);

最后结语


学会了这些可以做一个阴阳师的自动刷觉醒,御魂等的脚本。解放你的双手还能做出一些qq轰炸机一类的骚东西。自动抢购东西的脚本。但你还需要在算法这一块进一步完善。

写篇推文不容易,关注分享,感谢你!

在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值