博舍

【Java】在Java中实现自动化脚本 java可以做自动化吗知乎

【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脚本就可以在其它软件/游戏内进行模拟点击、按键等操作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇