JAVA 鼠标控制与键盘输入控制

核心类:java.awt.Robot

该类是JDK定义的电脑系统的抽象类,可以用来模拟实现鼠标点击与键盘输入等信息

简单实现一个自动抢票代码:

java 复制代码
Robot rt = new Robot();

//可以认为是操作间隔的停歇时间,比如等待页面加载,等弹框内容展示等
rt.delay(1000);

//鼠标移动到指定位置
rt.mouseMove(876,231);


//点击动作由下压+回弹组成
//点击按下去
rt.mousePress(InputEvent.BUTTON1_MASK);
rt.delay(100);
//放开回弹
rt.mouseRelease(InputEvent.BUTTON1_MASK);


//copy黏贴文本
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
String[] authors = msgArr.get(getRandomIntNum()).split("[,]");
Transferable text = new StringSelection(authors[0]);
//将消息数组中的文本copy到粘贴板,使用ctrl+V即可完成粘贴
clip.setContents(text, null);

//组合键使用ctrl+V,控制电脑完成粘贴动作
rt.keyPress(KeyEvent.VK_CONTROL);
rt.keyPress(KeyEvent.VK_V);


//获取鼠标坐标
Point point = java.awt.MouseInfo.getPointerInfo().getLocation();
System.out.println("" + point.x+" , "+point.y);


//实际使用时配合线程调度
/**
* Launch the application.
*
* 实时获取鼠标坐标
*/
public static void main(String[] args) {
    try {
        MouseInfo info_frame = new MouseInfo();
        info_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        info_frame.setVisible(true);
        info_frame.setAlwaysOnTop(true);
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Point point = java.awt.MouseInfo.getPointerInfo().getLocation();
                System.out.println("" + point.x+" , "+point.y);
                try {
                    Thread.sleep(3000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 100, 100);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

鼠标点击模拟时 有三种按键类型:

InputEvent.BUTTON1_MASK 左键 (食指点击)

InputEvent.BUTTON2_MASK 中键 (滚轮)

InputEvent.BUTTON3_MASK 右键(中指点击)

WIN10 系统桌面坐标拾取

得到的信息需要根据屏幕--显示设置--缩放与布局的百分比进行计算

当桌面缩放与布局 设置100%时,直接使用鼠标拾取的坐标 X,Y 即可

当桌面缩放与布局 设置125%时,需要使用计算后的位置坐标 X/125 ,Y/125

java 复制代码
package com.test.domain;

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Operation {
    //时间间隔 1s
    final static  int DELAY=1000;

    private static List<String> msgArr=new ArrayList<String>();

    public static int getRandomIntNum() {
        int max=10;
        int min=1;
        Random random = new Random();
        return random.nextInt(max)%(max-min+1) + min;
    }
    /**
     * 用法简介:脚本程序跑起来之后鼠标选中需要轰炸得聊天窗口,需要聊天窗口能获取到鼠标得焦点
     *
     * @param args
     * @throws AWTException
     */
    public static void main1(String[] args) throws AWTException {
        //轰炸内容
        for (int i = 0; i < 10; i++) {
            String emoj="[炸弹] [炸弹] [炸弹] [炸弹] [炸弹] [炸弹] [炸弹][炸弹] [炸弹] ";
            msgArr.add("轰炸机,消息轰炸 ->"+i+emoj);
        }
        Robot robot = new Robot();
        robot.delay(5000);
        Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
        String[] authors = msgArr.get(getRandomIntNum()).split("[,]");
        //循环轰炸
        for (int j = 0; j < 100; j++){
            for (int i = 0; i < authors.length; i++) {
                String str1 = authors[i];
                Transferable text = new StringSelection(str1);
                clip.setContents(text, null);
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.delay(100);
                robot.keyPress(KeyEvent.VK_ENTER);
            }
        }
    }


    /**
     * 用法简介:脚本程序跑起来之前需要打开需要轰炸的对方聊天窗口,并全屏
     * 注:根据实际系统设置不同使用前需要将自己桌面缩放与布局大小调整为100%
     *     另需要用mouseInfo 工具类获取到自己电脑上面发送 钉 消息的几个操作按钮坐标
     *     1.聊天窗口中的 DING一下按钮 鼠标点击坐标
     *     2.DING一下  窗口文本输入框位置坐标
     *     3.DING一下 发送按钮鼠标点击坐标
     *
     * @param args
     * @throws AWTException
     */
    public static void main(String[] args) throws AWTException {
        //轰炸内容
        for (int i = 0; i < 10; i++) {
            String emoj = "[炸弹] [炸弹] [炸弹] [炸弹] [炸弹] [炸弹] [炸弹][炸弹] [炸弹] ";
            msgArr.add("轰炸机,消息轰炸 ->" + i + emoj);
        }
        Robot robot = new Robot();
        robot.delay(1000);

        //循环轰炸
        for (int j = 0; j < 3; j++) {
            robot.mouseMove(650, 880);
            Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
            String[] authors = msgArr.get(getRandomIntNum()).split("[,]");
            //钉钉聊天框钉按钮鼠标点击位置坐标:819,798
            Danji(robot, 650, 880,1500);
            //钉窗口文本输入鼠标点击位置坐标:551,399
            Danji(robot, 1132, 466,100);
            Danji(robot, 1132, 466,100);
            Transferable text = new StringSelection(authors[0]);
            clip.setContents(text, null);
            robot.keyPress(KeyEvent.VK_CONTROL);
            robot.keyPress(KeyEvent.VK_V);
            robot.delay(1000);
            //钉消息发送按钮鼠标点击位置坐标:489,891
            Danji(robot, 576, 835,300);
        }
    }



    //鼠标移动到指定坐标,然后单击
    public  static  void Danji(Robot rt,int x, int y,int times){
        rt.mouseMove(-1,-1);//初始化
        rt.delay(100);
        rt.mouseMove(x,y);//制动到指定位置
        rt.delay(100);
        pressMouse(rt, InputEvent.BUTTON1_MASK,times);
    }

    //鼠标点击事件
    public  static  void pressMouse(Robot rt,int m,int times){
        rt.mousePress(m);
        rt.delay(100);
        rt.mouseRelease(m);
        rt.delay(times);
        System.out.printf("鼠标点击完成"+m);
    }

    //将指定内容粘贴到粘贴板 然后ctrl+v
    public static void outPut(String str,Robot rt){
        StringSelection selection = new StringSelection(str);
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection,selection);
        keyPressWithCotrl(rt,KeyEvent.VK_V);
    }

    //ctrl组合键 相当于按下CTRL再按下传入的key值
    public  static  void keyPressWithCotrl(Robot rt,int key){
        rt.keyPress(KeyEvent.VK_CONTROL);
        rt.keyPress(key);
        rt.keyRelease(KeyEvent.VK_CONTROL);
        rt.keyRelease(key);
        rt.delay(DELAY);
    }

}
java 复制代码
package com.test.domain;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.Point;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Color;
public class MouseInfo extends JFrame {
    private final JPanel contentPanel = new JPanel();
    JLabel value_x = null;
    JLabel value_y = null;
    /**
     * Launch the application.
     *
     * 实时获取鼠标坐标
     */
    public static void main(String[] args) {
        try {
            MouseInfo info_frame = new MouseInfo();
            info_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            info_frame.setVisible(true);
            info_frame.setAlwaysOnTop(true);
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    Point point = java.awt.MouseInfo.getPointerInfo().getLocation();
                    System.out.println("" + point.x+" , "+point.y);
                    try {
                        Thread.sleep(3000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, 100, 100);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Create the dialog.
     */
    public MouseInfo() {
        setTitle("\u9F20\u6807\u5750\u6807\u83B7\u53D6\u5668");
        setBounds(100, 100, 217, 156);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        contentPanel.setLayout(null);

        JLabel lblx = new JLabel("\u5750\u6807x:");
        lblx.setFont(new Font("宋体", Font.PLAIN, 15));
        lblx.setBounds(22, 27, 66, 31);
        contentPanel.add(lblx);

        JLabel lbly = new JLabel("\u5750\u6807y:");
        lbly.setFont(new Font("宋体", Font.PLAIN, 15));
        lbly.setBounds(22, 68, 66, 31);
        contentPanel.add(lbly);

        value_x = new JLabel("0");
        value_x.setForeground(Color.BLUE);
        value_x.setFont(new Font("宋体", Font.PLAIN, 20));
        value_x.setBounds(82, 27, 66, 31);
        contentPanel.add(value_x);

        value_y = new JLabel("0");
        value_y.setForeground(Color.BLUE);
        value_y.setFont(new Font("宋体", Font.PLAIN, 20));
        value_y.setBounds(82, 68, 66, 31);
        contentPanel.add(value_y);
    }
}
相关推荐
凡人的AI工具箱4 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
陈王卜6 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、7 分钟前
Spring Boot 注解
java·spring boot
java亮小白199712 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF18 分钟前
java Queue 详解
java·队列
chnming198720 分钟前
STL关联式容器之map
开发语言·c++
进击的六角龙21 分钟前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂22 分钟前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc29 分钟前
Python简介以及解释器安装(保姆级教学)
开发语言·python
程序伍六七33 分钟前
day16
开发语言·c++