个人随笔
目录
Java Robot应用示例之机器人功能
2019-09-11 23:31:18

很多时候,我们希望能够实现自动测试,自动演示功能,或者是其它的一些鼠标和键盘控制的应用(比如帮人点击广告赚利润等)。出于这样的目的,自从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. public class Common {
  2. /**
  3. * 鼠标单击(左击),要双击就连续调用
  4. *
  5. * @param r
  6. * @param x
  7. * x坐标位置
  8. * @param y
  9. * y坐标位置
  10. * @param delay
  11. * 该操作后的延迟时间
  12. */
  13. public static void clickLMouse(Robot r, int x, int y, int delay) {
  14. r.mouseMove(x, y);
  15. r.mousePress(InputEvent.BUTTON1_MASK);
  16. r.delay(10);
  17. r.mouseRelease(InputEvent.BUTTON1_MASK);
  18. r.delay(delay);
  19. }
  20. /**
  21. * 鼠标右击,要双击就连续调用
  22. *
  23. * @param r
  24. * @param x
  25. * x坐标位置
  26. * @param y
  27. * y坐标位置
  28. * @param delay
  29. * 该操作后的延迟时间
  30. */
  31. public static void clickRMouse(Robot r, int x, int y, int delay) {
  32. r.mouseMove(x, y);
  33. r.mousePress(InputEvent.BUTTON3_MASK);
  34. r.delay(10);
  35. r.mouseRelease(InputEvent.BUTTON3_MASK);
  36. r.delay(delay);
  37. }
  38. /**
  39. * 键盘输入(一次只能输入一个字符)
  40. *
  41. * @param r
  42. * @param ks
  43. * 键盘输入的字符数组
  44. * @param delay
  45. * 输入一个键后的延迟时间
  46. */
  47. public static void pressKeys(Robot r, int[] ks, int delay) {
  48. for (int i = 0; i < ks.length; i++) {
  49. r.keyPress(ks[i]);
  50. r.delay(10);
  51. r.keyRelease(ks[i]);
  52. r.delay(delay);
  53. }
  54. }
  55. /**
  56. * 复制
  57. *
  58. * @param r
  59. * @throws InterruptedException
  60. */
  61. void doCopy(Robot r) throws InterruptedException {
  62. Thread.sleep(3000);
  63. r.setAutoDelay(200);
  64. r.keyPress(KeyEvent.VK_CONTROL);
  65. r.keyPress(KeyEvent.VK_C);
  66. r.keyRelease(KeyEvent.VK_CONTROL);
  67. r.keyRelease(KeyEvent.VK_C);
  68. }
  69. /**
  70. * 粘贴
  71. *
  72. * @param r
  73. * @throws InterruptedException
  74. */
  75. void doParse(Robot r) throws InterruptedException {
  76. r.setAutoDelay(500);
  77. Thread.sleep(2000);
  78. r.mouseMove(300, 300);
  79. r.mousePress(InputEvent.BUTTON1_MASK);
  80. r.mouseRelease(InputEvent.BUTTON1_MASK);
  81. r.keyPress(KeyEvent.VK_CONTROL);
  82. r.keyPress(KeyEvent.VK_V);
  83. r.keyRelease(KeyEvent.VK_CONTROL);
  84. r.keyRelease(KeyEvent.VK_V);
  85. }
  86. /**
  87. * 捕捉全屏慕
  88. *
  89. * @param r
  90. * @return
  91. */
  92. public Icon captureFullScreen(Robot r) {
  93. BufferedImage fullScreenImage = r.createScreenCapture(new Rectangle(
  94. Toolkit.getDefaultToolkit().getScreenSize()));
  95. ImageIcon icon = new ImageIcon(fullScreenImage);
  96. return icon;
  97. }
  98. /**
  99. * 捕捉屏幕的一个矫形区域
  100. *
  101. * @param r
  102. * @param x
  103. * x坐标位置
  104. * @param y
  105. * y坐标位置
  106. * @param width
  107. * 矩形的宽
  108. * @param height
  109. * 矩形的高
  110. * @return
  111. */
  112. public Icon capturePartScreen(Robot r, int x, int y, int width, int height) {
  113. r.mouseMove(x, y);
  114. BufferedImage fullScreenImage = r.createScreenCapture(new Rectangle(
  115. width, height));
  116. ImageIcon icon = new ImageIcon(fullScreenImage);
  117. return icon;
  118. }
  119. }

1、简单的模拟测试

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

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

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

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2