Java鼠标操作工具
最近游戏有个活动,啥游戏就不说了,策划坑的很,每分钟会生长出一根竹子,20根长满,不收就不长了,一直看着收,也没那个精力,需要收的数量还很大,所以没办法熬,手动是不能了,这辈子都不可能手动的,所以还是挂机让电脑自己点吧,滑稽#_#,想要源码运行,可以私聊留言哦
经了解Java中有Robot类可以做一些指令,然后就开始吧!
我写的只操作鼠标了,还可以模拟键盘输入的,方法很多,使用的时候参考提供的方法就行,方法名都是见名思意的。
这是将会用到的属性,我这就直接使用Main方法执行使用了。
/**
* 鼠标所在位置的X轴坐标
*/
private double mouseNowX = 0;
/**
* 鼠标所在位置的Y轴坐标
*/
private double mouseNowY = 0;
/**
* 鼠标循环点击次数
*/
private int clickNum = 0;
/**
* 是否循环点击鼠标
*/
private boolean isRoll = false;
/**
* 循环点击鼠标的线程
*/
private Thread rollClickThread = null;
/**
* 模拟操作的机器人
*/
private Robot robot = null;
这里基本都是用robot提供的基本方法,只有定时循环点击鼠标是通过新建一个线程去根据isRoll的布尔值做while判断循环,如果大家有什么其他办法希望提出来,我临时只想到这个办法;
构造函数
先在类创建时将需要的信息初始化,然后后面的方法就避免重复获取信息了;
/**
* 设置鼠标坐标信息
*/
private void setNowMouseInfo(){
System.out.println("初始化获取鼠标位置信息");
PointerInfo pointerInfo = MouseInfo.getPointerInfo();
Point point = pointerInfo.getLocation();
mouseNowX = point.getX();
System.out.println("当前鼠标X = " + mouseNowX);
mouseNowY = point.getY();
System.out.println("当前鼠标Y = " + mouseNowY);
}
/**
* 构造
*/
public RollClick() {
setNowMouseInfo();
try {
System.out.println("初始化操作机器人信息");
robot = new Robot();
} catch (AWTException e) {
System.out.println("初始化操作机器人信息发生错误 error = " + e.getMessage());
}
}
写一个点击鼠标的方法试一试
private void clickMouse(int button, int delay) {
System.out.println("鼠标所在位置 X =" + mouseNowX + " Y =" + mouseNowY + "按下 健 = " + button);
robot.mousePress(button);
robot.delay(50);
System.out.println("鼠标所在位置 X =" + mouseNowX + " Y =" + mouseNowY + "抬起 健 = " + button);
robot.mouseRelease(button);
robot.delay(delay);
}
点击并移动鼠标后再松开
其实就是将点击和移动在一起用,移动鼠标的方法这个方法有,我就不一一列举了,有需要的看一下robot的方法,然后按需组合就行了。
/**
* 点击并移动鼠标后松开鼠标
*/
private void moveMouseOnClick(int button, double addX, double addY, int delay) {
System.out.println("鼠标所在位置 X =" + mouseNowX + " Y =" + mouseNowY + "按下 健 = " + button);
robot.mousePress(button);
robot.delay(50);
System.out.println("要将鼠标移动 X + " + addX + " Y + " + addY);
mouseNowX += addX;
mouseNowY += addY;
robot.mouseMove((int) mouseNowX, (int) mouseNowY);
System.out.println("鼠标所在位置 X =" + mouseNowX + " Y =" + mouseNowY + "抬起 健 = " + button);
robot.mouseRelease(button);
robot.delay(delay);
}
重点来了,循环点击鼠标
private void setTimeOutclickMouse(int button, int timeOutMS) {
System.out.println("初始化鼠标点击次数 = " + clickNum);
clickNum = 0;
// 创建线程
if (rollClickThread == null){
rollClickThread = new Thread(
new Runnable(){
public void run() {
while (isRoll){
System.out.println("鼠标所在位置 X =" + mouseNowX + " Y =" + mouseNowY + "按下 健 = " + button);
robot.mousePress(button);
robot.delay(50);
System.out.println("鼠标所在位置 X =" + mouseNowX + " Y =" + mouseNowY + "抬起 健 = " + button);
robot.mouseRelease(button);
clickNum++;
System.out.println("鼠标点击次数 = " + clickNum);
robot.delay(timeOutMS);
}
}
}
);
}
// 判断当前状态,做相反状态,防止重复调用此方法,叠加线程的start
if (isRoll){
isRoll = false;
System.out.println("停止鼠标定时点击,频率每" + timeOutMS + "ms/次,已经点击" + clickNum + "次");
rollClickThread.stop();
} else {
isRoll = true;
System.out.println("开始鼠标定时点击,频率每" + timeOutMS + "ms/次");
rollClickThread.start();
}
// 主线程做监控输入,停止新建的线程内的循环
Scanner sc = new Scanner(System.in);
System.err.println("按任意键停止");
String any = sc.nextLine();
if (any != null) {
isRoll = false;
//
rollClickThread = null
System.out.println("已停止鼠标定时点击,频率每" + timeOutMS + "/次,已经点击" + clickNum + "次");
System.exit(0);
}
}
对线程的操作还是需要谨慎一点,避免死循环或者创建无用的线程,浪费资源
这个功能我试了,要点击游戏内的按钮,需要用管理员身份运行才可以,其他地方点击正常运行就可以,原因说不太清,也许是游戏的一些参数影响吧,权限到位啥都行了。
我感觉我写的一点也不高端,性能可能差劲但是好使了,如果有人有更好的办法,感谢分享一下