Java控制鼠标和键盘的方法
背景
几年前我还在玩舰C的时候,被舰C频繁收远征的操作给烦透了,后来搜到了一个自动收远征的辅助工具,用了一段时间,不是一般的轻松。我简单研究了一下它的原理和实现方式,大概是通过识别出各个按钮图片的位置并模拟鼠标点击来操作的,Java也可以通过编码来控制键盘和鼠标,本文将介绍Java里操作键盘鼠标的两种方式,并且会运用在某游戏的自动练级上。
Robot类
Java的Robot类提供了很多方法,包含了鼠标键盘以及屏幕的一些通用操作,一般用于自动化测试或者其他相关的场景中,下面是几个示例
一、获取鼠标当前的位置

二、模拟鼠标点击和键盘按键
Robot robot = new Robot();
robot.mouseMove(100, 100);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_ESCAPE);
robot.keyRelease(KeyEvent.VK_ESCAPE);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.keyRelease(KeyEvent.VK_CONTROL);
上面是移动鼠标以及模拟按键(示例中的按键是打开任务管理器)的代码。
在高分辨率(2k或者4k分辨率)下,java的robot相关类获取到的屏幕位置、鼠标位置等数值均不准确,需要对数值乘上一个固定的数值。
如果通过这个功能做一个辅助工具,需要满足这样的条件:鼠标点击的位置必须是固定的,否则就需要人工调整位置或者缩放,我找了一张少女前线的活动图来测试,编码思路如下:
需要录制鼠标点击位置以及间隔时间的程序,并输出这些数值
读取上一步输出的数值,调用对应的鼠标点击方法
下面是我最终的编码结果(未包含录制鼠标点击的程序)

这样每天的刷活动物资的任务就可以交给这个程序了。
等到活动结束后,我还想利用它进行练级等操作,仅仅靠鼠标移动点击是不能满足要求了,我找到了sikuli这个框架。
Sikuli
sikuli也是一个自动化框架,它的一个优点是可以传入图片或者文字,能够直接定位到图片或者文字在屏幕上的位置,我就又重构了一下。考虑到少前操作的一些特点,我简单设计了一个脚本:

脚本支持等待和点击某个元素、睡眠指定时间、条件操作等等。我将图片放入指定的目录,脚本中只需要写图片的文件名就行了。
脚本还支持引用别的脚本:

下面是脚本解析和执行的部分代码:

总结
本文简单介绍了Java的两种控制鼠标键盘的方法,通过这些,可以实现部分游戏的自动化重复操作,比如少女前线的练级、刷资源等等。Java有些不足的地方是,在程序运行的过程中,电脑是不能做其他操作的,否则就会影响程序正常运行,不过对我来说,这已经足够了。