起因:最近在玩一款手游,日常任务较为机械繁琐,故想利用脚本来自动完成,之前用C++写过一个鼠标脚本精灵,但是功能较单一,所以就没采用,想起来之前在B站看到过有人用Java来写脚本,便也想尝试一下。

主要解决问题

划线为已解决,其余还有待学习研究。

1. Java中模拟鼠标按下抬起操作、模拟键盘按键

利用Java自带的自动化测试类Robot,包为java.awt.Robot。
Robot中提供了许多用于自动化测试的方法:
可以通过查找API文档,如 API文档-java.awt.Robot
在这里插入图片描述
如果利用Robot来实现脚本则需要注意一些问题
模拟鼠标点击不能单单调用mousePress()来实现,应该考虑到人性化,即

一、玩家鼠标点击是包含鼠标按下与鼠标释放两个过程;

	    Robot bush = new Robot();
		
		bush.mousePress(InputEvent.BUTTON1_DOWN_MASK);
		
		bush.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
		

二、要考虑玩家鼠标点击过程中鼠标按下与释放是有间隔的,一般在0.2~0.4秒之间;

这里利用到Random来实现随机数,即实现每次鼠标点击时按下与释放的间隔不同,从而降低被游戏检测为脚本的风险。

 		Robot bush = new Robot();
		Random random  = new Random();
		
		bush.mousePress(InputEvent.BUTTON1_DOWN_MASK);
		
		double v = 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对象来接收表示鼠标当前位置的一个实例;

 Point point = java.awt.MouseInfo.getPointerInfo().getLocation();
		 System.out.println(point.x);
		 System.out.println(point.y);
		
3. Java捕获鼠标点击事件、键盘按键事件;

为什么会有这个需求呢?
因为脚本中经常会需要录制玩家操作,然后利用脚本重放,这就需要记录鼠标点击的位置、点击间隔时间、键盘是否按下某个按键等信息。

鼠标点击事件
Java中可以利用事件注册监听机制来实现捕获鼠标点击事件,但是捕获仅仅局限于在Java创建的控件区域内的点击事件,即在控件外的点击还无法捕获,或者说对于鼠标点击事件的监听不是全局的

如下为在某个Java控件中监听鼠标按下事件:

  info_frame.addMouseListener(new MyMouseList());	//info_frame为已定义并初始化的控件
      
  }
     static  class MyMouseList extends MouseAdapter
      {
    	  public void mousePressed(MouseEvent e)
    	  {
    		int x = e.getX();
    		
    		int y = e.getY();
    		System.out.println(x);
    		System.out.println(y);
    	  }
    	  
      }

键盘按键事件
键盘按键事件同理,存在局限,只能监听活动窗口为Java控件时的按键事件;

如下为在某个Java控件中监听按键事件:

 bt.addKeyListener(new KeyAdapter()		//bt为已定义并初始化的控件
        {
            public void keyPressed(KeyEvent e)
            {
                if(e.getKeyCode()==KeyEvent.VK_ESCAPE)
                   System.exit(0);
                //组合键
                else if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
                   System.exit(0);
                else System.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脚本就可以在其它软件/游戏内进行模拟点击、按键等操作。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐