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);
        }
    }

对线程的操作还是需要谨慎一点,避免死循环或者创建无用的线程,浪费资源

这个功能我试了,要点击游戏内的按钮,需要用管理员身份运行才可以,其他地方点击正常运行就可以,原因说不太清,也许是游戏的一些参数影响吧,权限到位啥都行了。

我感觉我写的一点也不高端,性能可能差劲但是好使了,如果有人有更好的办法,感谢分享一下

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值