服务器之家

服务器之家 > 正文

Java Robot应用示例之机器人功能

时间:2021-03-28 16:20     来源/作者:ytlcainiao

很多时候,我们希望能够实现自动测试,自动演示功能,或者是其它的一些鼠标和键盘控制的应用(比如帮人点击广告赚利润等)。出于这样的目的,自从JDK1.3开始,它就为我们提供了一个用来产生本机输入事件的机器人类 — java.awt.Robot. 

  下面我来详细介绍Robot的功能及应用示例:

一、Robot主要的功能

1. BufferedImage createScreenCapture(Rectangle screenRect) 

说明:该方法提供类似于键盘上的PrintScreen键的功能,将指定矩形区域内的屏幕像素copy下来产生一个BufferedImage。
应用:我们可以将这个方法用在图形程序中,或是用它来实现远端屏幕传输,可做成远端电脑监控程序等.

2. void delay(int ms)

说明:用来将当前的程序(thread)休眠(sleep)若干毫秒(ms)。
应用:可用来控制程序的延时。这个一般是必须的,因为你在两次间隔操作中肯定有延时。

3. Color getPixelColor(int x, int y)

说明:取得给定屏幕坐标像素位置的颜色值。
应用:就是取颜色RGB值,就不多说了。

4. void keyPress(int keycode)
 void keyRelease(int keycode)

说明:这两个方法的作用一看便知,用来产生指定键的按键按下与抬起动作,相当于Win32 API的keyb_event函数,即模拟键盘操作咯,具体keycode值就是KeyEvent.VK_C、KeyEvent.VK_D、KeyEvent.VK_CONTROL什么的,具体应用时直接看Eclipse提示就知道了。
应用:可用于程序的自动演示、测试等,非常有用。

5. void mouseMove(int x, int y)

说明:将鼠标光标移动到指定的屏幕坐标。
应用:可用于程序的自动演示、测试等,配合其他的方法使用,是不可缺少的。

6. void mousePress(int buttons)
 void mouseRelease(int buttons)
 void mouseWheel(int wheelAmt)

说明:上面的三种方法,产生指定鼠标按钮的按下,抬起,及滚轮动作,就是模拟鼠标操作咯,具体buttons的值有InputEvent.BUTTON1_MASK(鼠标左键)、InputEvent.BUTTON3_MASK(鼠标右键,如果是双键鼠标,请改用InputEvent.BUTTON2_MASK)等。

应用:一样也可用于程序的自动演示、测试等,配合其他方法使用,很重要。

二、应用实例

我写了两个比较小的应用实例,一个是简单的模拟测试,一个是自动点击广告赚利润的,下面分别演示。

首先编写一些公用的方法Common.java

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package com.alexia;
 
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
 
import javax.swing.Icon;
import javax.swing.ImageIcon;
 
/**
 * @description Robot帮助类,实现基本的功能
 * @author Alexia
 * @date 2013/5/18
 *
 */
public class Common {
 
  /**
   * 鼠标单击(左击),要双击就连续调用
   *
   * @param r
   * @param x
   *      x坐标位置
   * @param y
   *      y坐标位置
   * @param delay
   *      该操作后的延迟时间
   */
  public static void clickLMouse(Robot r, int x, int y, int delay) {
    r.mouseMove(x, y);
    r.mousePress(InputEvent.BUTTON1_MASK);
    r.delay(10);
    r.mouseRelease(InputEvent.BUTTON1_MASK);
    r.delay(delay);
 
  }
 
  /**
   * 鼠标右击,要双击就连续调用
   *
   * @param r
   * @param x
   *      x坐标位置
   * @param y
   *      y坐标位置
   * @param delay
   *      该操作后的延迟时间
   */
  public static void clickRMouse(Robot r, int x, int y, int delay) {
    r.mouseMove(x, y);
    r.mousePress(InputEvent.BUTTON3_MASK);
    r.delay(10);
    r.mouseRelease(InputEvent.BUTTON3_MASK);
    r.delay(delay);
 
  }
 
  /**
   * 键盘输入(一次只能输入一个字符)
   *
   * @param r
   * @param ks
   *      键盘输入的字符数组
   * @param delay
   *      输入一个键后的延迟时间
   */
  public static void pressKeys(Robot r, int[] ks, int delay) {
    for (int i = 0; i < ks.length; i++) {
      r.keyPress(ks[i]);
      r.delay(10);
      r.keyRelease(ks[i]);
      r.delay(delay);
    }
  }
 
  /**
   * 复制
   *
   * @param r
   * @throws InterruptedException
   */
  void doCopy(Robot r) throws InterruptedException {
    Thread.sleep(3000);
    r.setAutoDelay(200);
    r.keyPress(KeyEvent.VK_CONTROL);
    r.keyPress(KeyEvent.VK_C);
    r.keyRelease(KeyEvent.VK_CONTROL);
    r.keyRelease(KeyEvent.VK_C);
  }
 
  /**
   * 粘贴
   *
   * @param r
   * @throws InterruptedException
   */
  void doParse(Robot r) throws InterruptedException {
    r.setAutoDelay(500);
    Thread.sleep(2000);
    r.mouseMove(300, 300);
    r.mousePress(InputEvent.BUTTON1_MASK);
    r.mouseRelease(InputEvent.BUTTON1_MASK);
    r.keyPress(KeyEvent.VK_CONTROL);
    r.keyPress(KeyEvent.VK_V);
    r.keyRelease(KeyEvent.VK_CONTROL);
    r.keyRelease(KeyEvent.VK_V);
  }
 
  /**
   * 捕捉全屏慕
   *
   * @param r
   * @return
   */
  public Icon captureFullScreen(Robot r) {
    BufferedImage fullScreenImage = r.createScreenCapture(new Rectangle(
        Toolkit.getDefaultToolkit().getScreenSize()));
    ImageIcon icon = new ImageIcon(fullScreenImage);
    return icon;
  }
 
  /**
   * 捕捉屏幕的一个矫形区域
   *
   * @param r
   * @param x
   *      x坐标位置
   * @param y
   *      y坐标位置
   * @param width
   *      矩形的宽
   * @param height
   *      矩形的高
   * @return
   */
  public Icon capturePartScreen(Robot r, int x, int y, int width, int height) {
    r.mouseMove(x, y);
    BufferedImage fullScreenImage = r.createScreenCapture(new Rectangle(
        width, height));
    ImageIcon icon = new ImageIcon(fullScreenImage);
    return icon;
  }
 
}

在示例之前,注意屏幕坐标位置如何确定,我是下载了一个小工具,用起来十分方便,建议大家使用

1. 简单的模拟测试

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.alexia;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.JOptionPane;
 
public class SimpleTest {
   
  public static void main(String[] args) throws Exception {
 
    final Robot rb = new Robot();
 
    new Thread() {
      public void run() {
        rb.delay(2000); // 模拟回车
        rb.keyPress(KeyEvent.VK_ENTER);
        rb.keyRelease(KeyEvent.VK_ENTER);
      }
    }.start();
 
    rb.delay(3000);
 
    // 设置开始菜单的大概位置
    int x = 40;
    int y = Toolkit.getDefaultToolkit().getScreenSize().height - 10; // 鼠标移动到开始菜单,
    rb.mouseMove(x, y);
    rb.delay(500);
 
    // 单击开始菜单
    Common.clickLMouse(rb, x, y, 500);
     
    rb.delay(1000);
 
    // 运行CMD命令cmd enter
    int[] ks = { KeyEvent.VK_C, KeyEvent.VK_M,
        KeyEvent.VK_D, KeyEvent.VK_ENTER, };
    Common.pressKeys(rb, ks, 500);
    rb.mouseMove(400, 400);
    rb.delay(500);
 
    // 运行DIR命令dir enter
    ks = new int[] { KeyEvent.VK_D, KeyEvent.VK_I, KeyEvent.VK_R,
        KeyEvent.VK_ENTER };
    Common.pressKeys(rb, ks, 500);
    rb.delay(1000);
 
    // 运行CLS命令cls enter
    ks = new int[] { KeyEvent.VK_C, KeyEvent.VK_L, KeyEvent.VK_S,
        KeyEvent.VK_ENTER };
    Common.pressKeys(rb, ks, 500);
    rb.delay(1000);
 
    // 运行EXIT命令exit enter
    ks = new int[] { KeyEvent.VK_E, KeyEvent.VK_X, KeyEvent.VK_I,
        KeyEvent.VK_T, KeyEvent.VK_ENTER };
    Common.pressKeys(rb, ks, 500);
    rb.delay(1000);
 
    // 右键测试
    x = Toolkit.getDefaultToolkit().getScreenSize().width - 50;
    Common.clickRMouse(rb, x, y, 500);
 
    new Thread() {
      public void run() {
        rb.delay(1000); // 回车
        rb.keyPress(KeyEvent.VK_ENTER);
        rb.keyRelease(KeyEvent.VK_ENTER);
      }
    }.start();
 
    JOptionPane.showMessageDialog(null, "演示完毕!");
  }
}

2. 点击网易广告赚取微薄利润

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package com.alexia;
 
import java.awt.AWTException;
import java.awt.Desktop;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.net.URI;
import java.util.Random;
 
public class AutoClickAds {
 
  private Robot robot;
 
  private volatile boolean stop = false;
 
  /** Creates a new instance of Main */
 
  public AutoClickAds() {
 
    try {
 
      robot = new Robot();
 
    } catch (AWTException ex) {
 
      ex.printStackTrace();
 
    }
  }
 
  public void init() {
 
    robot.delay(3000);
     
    System.out.println("Click Ads start");
 
    // 在新的浏览器窗口或在已有的浏览器窗口打开指定的URL(JDK 1.6以上)
    Desktop desktop = Desktop.getDesktop();
    if (Desktop.isDesktopSupported() && desktop.isSupported(Desktop.Action.BROWSE)) {
      URI uri = URI.create("http://lanxuezaipiao.blog.163.com/");
      try {
        desktop.browse(uri);
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
     
    try {
      run();
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
 
    stop();
 
    System.out.println("Click Ads stoped");
 
  }
 
  public void run() throws InterruptedException {
    int count = 1;
     
    while (!stop) {
      robot.delay(8000);
       
      int x = 576;
      int y = 567;
      Random r = new Random();
 
      Common.clickLMouse(robot, x, y, 3000);
 
      // 输入向下箭头,实现翻页
      int[] ks = { KeyEvent.VK_DOWN };
      for (int i = 0; i < 10; i++)
        Common.pressKeys(robot, ks, 0);
 
      int[][] a = { { 500, 103 }, { 500, 163 }, { 500, 223 },
          { 500, 283 }, { 500, 343 }, { 500, 403 }, { 500, 463 },
          { 500, 523 }, { 500, 583 }, { 500, 643 }, };
      int b = r.nextInt(5);
      x = a[b][0];
      y = a[b][1];
 
      Common.clickLMouse(robot, x, y, 1000);
 
      // 输入向下箭头,实现翻页
      for (int i = 0; i < 500; i++)
        Common.pressKeys(robot, ks, 0);
 
      // 输入向下箭头,实现翻页
      int[] kups = { KeyEvent.VK_UP };
      for (int i = 0; i < 3; i++)
        Common.pressKeys(robot, kups, 0);
 
      x = 900;
      y = 210;
      Common.clickLMouse(robot, x, y, 3000);
       
      x =1090;
      y =15;
      Common.clickLMouse(robot, x, y, 3000);
       
      x = 900;
      y = 135;
      Common.clickLMouse(robot, x, y, 3000);
 
      System.out.println("成功点击第" + count + "个广告!");
    }
 
  }
 
  public synchronized void stop() {
 
    stop = true;
 
  }
 
  /**
   * * @param args the command line arguments
   *
   * @throws InterruptedException
   */
  public static void main(String[] args) throws InterruptedException {
 
    AutoClickAds mc = new AutoClickAds();
    mc.init();
 
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/ytlcainiao/article/details/45021803

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部