解放双手的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轰炸机一类的骚东西。自动抢购东西的脚本。但你还需要在算法这一块进一步完善。
写篇推文不容易,关注分享,感谢你!