【Java】在Java中实现自动化脚本
起因:最近在玩一款手游,日常任务较为机械繁琐,故想利用脚本来自动完成,之前用C++写过一个鼠标脚本精灵,但是功能较单一,所以就没采用,想起来之前在B站看到过有人用Java来写脚本,便也想尝试一下。
主要解决问题划线为已解决,其余还有待学习研究。
1.Java中模拟鼠标按下抬起操作、模拟键盘按键;利用Java自带的自动化测试类Robot,包为java.awt.Robot。Robot中提供了许多用于自动化测试的方法:可以通过查找API文档,如API文档-java.awt.Robot;如果利用Robot来实现脚本则需要注意一些问题:模拟鼠标点击不能单单调用mousePress()来实现,应该考虑到人性化,即
一、玩家鼠标点击是包含鼠标按下与鼠标释放两个过程;
Robotbush=newRobot();bush.mousePress(InputEvent.BUTTON1_DOWN_MASK);bush.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);二、要考虑玩家鼠标点击过程中鼠标按下与释放是有间隔的,一般在0.2~0.4秒之间;
这里利用到Random来实现随机数,即实现每次鼠标点击时按下与释放的间隔不同,从而降低被游戏检测为脚本的风险。
Robotbush=newRobot();Randomrandom=newRandom();bush.mousePress(InputEvent.BUTTON1_DOWN_MASK);doublev=0.2+random.nextDouble()*(0.4-0.2);//随机0.2~0.4秒间隔v=v*1000;bush.delay((int)v);bush.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);2.Java获取鼠标指针的屏幕位置;利用java.awt.MouseInfo类的方法获取,MouseInfo类主要记录了与鼠标状态相关的信息。
创建一个Point对象来接收表示鼠标当前位置的一个实例;
Pointpoint=java.awt.MouseInfo.getPointerInfo().getLocation();System.out.println(point.x);System.out.println(point.y);3.Java捕获鼠标点击事件、键盘按键事件;为什么会有这个需求呢?因为脚本中经常会需要录制玩家操作,然后利用脚本重放,这就需要记录鼠标点击的位置、点击间隔时间、键盘是否按下某个按键等信息。
鼠标点击事件Java中可以利用事件注册监听机制来实现捕获鼠标点击事件,但是捕获仅仅局限于在Java创建的控件区域内的点击事件,即在控件外的点击还无法捕获,或者说对于鼠标点击事件的监听不是全局的。
如下为在某个Java控件中监听鼠标按下事件:
info_frame.addMouseListener(newMyMouseList());//info_frame为已定义并初始化的控件}staticclassMyMouseListextendsMouseAdapter{publicvoidmousePressed(MouseEvente){intx=e.getX();inty=e.getY();System.out.println(x);System.out.println(y);}}键盘按键事件键盘按键事件同理,存在局限,只能监听活动窗口为Java控件时的按键事件;
如下为在某个Java控件中监听按键事件:
bt.addKeyListener(newKeyAdapter()//bt为已定义并初始化的控件{publicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_ESCAPE)System.exit(0);//组合键elseif(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)System.exit(0);elseSystem.out.println(e.getKeyChar());}});4.Java中实现钩子功能;(即游戏即使后台运行,脚本也能正常运行,而不影响计算机的正常使用)
对于Java中实现钩子功能我还没能找到很好的解决方法,以下转自百度知道:
JAVA是运行在虚拟机上的,而钩子函数是直接对操作系统进行操作控制的,这也是Java和C的主要区别之一,Java要实现钩子函数比较麻烦,需要使用JNI技术,就是Java本地接口,调用C写的钩子函数,所以你还要学会用C写一个钩子函数,然后再用Java的JNI调用C;
从中感觉在Java中实现钩子貌似有点拖拉,有违写脚本便利的初心,所以还是利用其它脚本语言如lua来实现较为便利。
5.Java实现的脚本无法在其它软件、游戏界面内运行;之前一直以为是脚本的问题,或者是软件/游戏屏蔽了脚本,后面一想,Java就是模拟人工点击,怎么会被检测出来,便上网查了一下资料,原来是管理员权限的问题,解决方法如下:
运行Java程序的开发环境如Eclipse时,右键–以管理员身份运行:这样子写的Java脚本就可以在其它软件/游戏内进行模拟点击、按键等操作。