现在一些手游可以在电脑模拟器实现操作,有一些无聊的副本手动去操作太浪费时间,网上的按键精灵功能太单一,按键时间固定又容易被识别,闲来无事写了一个java脚本实现按键时间周期设置,以及多个点的点击。
在使用按键的时候java的窗口自动切换到后台,按键无法响应,为了实现窗口后台响应我这里需要导入一个第三方jar包jintellitype,具体代码如下
import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.MouseInfo; import java.awt.Point; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import com.melloware.jintellitype.HotkeyListener; import com.melloware.jintellitype.JIntellitype; /** * 这是窗口类,用来设置窗口 * * @author Stanley * */ public class KeyFrame extends JFrame implements Runnable { /** * */ private static final long serialVersionUID = 1L; // 初始提示 private JLabel startLabel = new JLabel("鼠标初始位置"); // 初始位置 private JTextArea startArea = new JTextArea(); // 第二次提示 private JLabel secLabel = new JLabel("鼠标第二次点击"); // 第二次确认位置 private JTextArea secArea = new JTextArea(); // 第三次提示 private JLabel endLabel = new JLabel("鼠标最终位置"); // 第三次确认位置 private JTextArea endArea = new JTextArea(); // 输入时间范围 private JLabel timeLabel = new JLabel("请输入每个周期时间范围(s)"); private JLabel space = new JLabel(""); private JLabel minTimeLabel = new JLabel("请输入最小时间(s)"); private JLabel maxTimeLabel = new JLabel("请输入最大时间(s)"); private JLabel timeIntervalLabel = new JLabel("两次点击时间间隔(s)"); private JLabel timesLabel = new JLabel("请输入周期次数"); private JLabel lessTimes = new JLabel("剩余次数"); // 最小时间 private JTextField minTimeTextField = new JTextField(); // 最大时间 private JTextField maxTimeTextField = new JTextField(); // 时间间隔 private JTextField timeIntervalTextField = new JTextField(); // 时间间隔 private JTextField timesTextField = new JTextField(); // 剩余次数 private JTextArea lessTimeArea = new JTextArea(); // 版权 private JLabel author = new JLabel("Stanley Xu 制作"); // 鼠标当前坐标 double pointY = 0; double pointX = 0; // 鼠标起始坐标 double startX = 0; double startY = 0; // 鼠标最终坐标 double secX = 0; double secY = 0; // 鼠标最终坐标 double endX = 0; double endY = 0; // 线程运行标记 boolean autoFlag = false; // 设置时间范围 double minTime = 1000; double maxTime = 2000; double timeInterval = 300; int n = 0; int i = 0; public void showPanel() { // 设置窗口大小 this.setSize(500, 300); // 布置窗口内容 JPanel panel = new JPanel(); // 设置边框 startArea.setBorder(BorderFactory.createLineBorder(Color.gray, 1)); secArea.setBorder(BorderFactory.createLineBorder(Color.gray, 1)); endArea.setBorder(BorderFactory.createLineBorder(Color.gray, 1)); lessTimeArea.setBorder(BorderFactory.createLineBorder(Color.gray, 1)); // 布置格式 panel.setLayout(new GridLayout(13, 2)); panel.add(startLabel); panel.add(startArea); // panel.add(startButton); panel.add(secLabel); panel.add(secArea); panel.add(endLabel); panel.add(endArea); panel.add(timeLabel); panel.add(space); panel.add(minTimeLabel); panel.add(minTimeTextField); panel.add(maxTimeLabel); panel.add(maxTimeTextField); panel.add(timeIntervalLabel); panel.add(timeIntervalTextField); panel.add(timesLabel); panel.add(timesTextField); panel.add(lessTimes); panel.add(lessTimeArea); // 布置操作提示 JLabel metionLabel1 = new JLabel("F1确认鼠标初始位置"); JLabel metionLabel2 = new JLabel("F2确认鼠标最终位置"); JLabel metionLabel3 = new JLabel("F3确认鼠标最终位置"); JLabel metionLabel4 = new JLabel(""); JLabel metionLabel5 = new JLabel("F4开始结束 "); JLabel metionLabel6 = new JLabel("F5退出 "); JLabel metionLabel7 = new JLabel("F6最小化"); JLabel metionLabel8 = new JLabel("F7恢复窗口"); panel.add(metionLabel1); panel.add(metionLabel2); panel.add(metionLabel3); panel.add(metionLabel4); panel.add(metionLabel5); panel.add(metionLabel6); panel.add(metionLabel7); panel.add(metionLabel8); // 显示窗口 JPanel authorPanel = new JPanel(); authorPanel.setLayout(new FlowLayout()); authorPanel.add(author); this.setLayout(new BorderLayout()); this.add(panel, BorderLayout.CENTER); this.add(authorPanel, BorderLayout.SOUTH); // 增加键盘监听 Thread t = new Thread(this); t.setPriority(Thread.MAX_PRIORITY); t.start(); // 0表示F1,1表示F2,2表示F3,3表示F4,4表示F5,5表示F6,6表示F7 JIntellitype.getInstance().registerHotKey(0, 0, 112); JIntellitype.getInstance().registerHotKey(1, 0, 113); JIntellitype.getInstance().registerHotKey(2, 0, 114); JIntellitype.getInstance().registerHotKey(3, 0, 115); JIntellitype.getInstance().registerHotKey(4, 0, 116); JIntellitype.getInstance().registerHotKey(5, 0, 117); JIntellitype.getInstance().registerHotKey(6, 0, 118); JIntellitype.getInstance().addHotKeyListener(new HotkeyListener() { @Override public void onHotKey(int arg0) { // TODO Auto-generated method stub Point mousePoint = MouseInfo.getPointerInfo().getLocation(); pointX = mousePoint.getX(); pointY = mousePoint.getY(); // 确认起始坐标 if (arg0 == 0) { startArea.setText("x:" + pointX + " y:" + pointY); startX = pointX; startY = pointY; // 确认最终始坐标 } else if (arg0 == 1) { secArea.setText("x:" + pointX + " y:" + pointY); secX = pointX; secY = pointY; } else if (arg0 == 2) { endArea.setText("x:" + pointX + " y:" + pointY); endX = pointX; endY = pointY; } else if (arg0 == 3 && autoFlag == false) { if (secX == 0 && secY == 0) { secX = startX; secY = startY; } if (endX == 0 && endY == 0) { endX = startX; endY = startY; } try { maxTime = Double.valueOf(maxTimeTextField.getText())* 1000; minTime = Double.valueOf(minTimeTextField.getText()) * 1000; timeInterval = Double.valueOf(timeIntervalTextField.getText()) * 1000; n = Integer.valueOf(timesTextField.getText()); } catch (Exception e) { minTime = 1000; maxTime = 2000; timeInterval = 300; n = 10; } if ((startX == 0 && startY == 0)) { autoFlag = false; } else { autoFlag = true; } // 最小化 // setExtendedState(JFrame.ICONIFIED); // autoFlag 为true,表示程序运行,按F4 暂停程序 } else if (arg0 == 3&& autoFlag == true) { i = 0; autoFlag = false; // 窗口正常 // setExtendedState(JFrame.NORMAL); // F5退出程序 } else if (arg0 == 4) { System.exit(0); } else if (arg0 == 5) { setExtendedState(JFrame.ICONIFIED); } else if (arg0 == 6) { setExtendedState(JFrame.NORMAL); } } }); setTitle("按键精灵"); this.setVisible(true); // 窗口一直在上面 this.setAlwaysOnTop(true); } @Override public void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(10); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } while (autoFlag && i <= n) { lessTimeArea.setText(n - i + "次"); i++; double time = timeCal(minTime, maxTime); RobotOperation.mouseOp(startX, startY, secX,secY,endX, endY, timeInterval); try { Thread.sleep((long) time); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } // 计算时间范围 public double timeCal(double minTime, double maxTime) { double timeDev = maxTime - minTime; double time = (timeDev * (Math.random())) + minTime; return time; } }
import java.awt.AWTException; import java.awt.Robot; import java.awt.event.KeyEvent; /** * 鼠标自动控制类 * * @author Stanley * */ public class RobotOperation { public static void mouseOp(double startX, double startY, double secX,double secY, double endX, double endY,double timeInterval) { try { Robot rbt = new Robot(); rbt.mouseMove((int) startX, (int) startY);// 移动到初始位置 rbt.delay(100);// 休息0.1秒按鼠标 rbt.mousePress(KeyEvent.BUTTON1_DOWN_MASK);// 按下鼠标 // rbt.delay(1000); rbt.mouseRelease(KeyEvent.BUTTON1_DOWN_MASK);// 放开鼠标 rbt.delay((int) timeInterval);// 休息间隔时间 rbt.mouseMove((int) secX, (int) secY); rbt.delay(100); rbt.mousePress(KeyEvent.BUTTON1_DOWN_MASK); // rbt.delay(1000); rbt.mouseRelease(KeyEvent.BUTTON1_DOWN_MASK); rbt.delay((int) timeInterval); rbt.mouseMove((int) endX, (int) endY); rbt.delay(100); rbt.mousePress(KeyEvent.BUTTON1_DOWN_MASK); // rbt.delay(1000); rbt.mouseRelease(KeyEvent.BUTTON1_DOWN_MASK); rbt.delay((int) timeInterval); } catch (AWTException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
/** * 测试类 * @author Stanley * */ public class Test { public static void main(String[] args) { KeyFrame kf = new KeyFrame(); kf.showPanel(); } }
最终实现效果如下