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

很多时候,我们希望能够实现自动测试,自动演示功能,或者是其它的一些鼠标和键盘控制的应用(比如帮人点击广告赚利润等)。出于这样的目的,自从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

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. 简单的模拟测试

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. 点击网易广告赚取微薄利润

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

  }
} 

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

您可能感兴趣的文章:

  • java数据结构实现机器人行走
  • java实现小i机器人api接口调用示例
  • java计算机器人的运动范围
(0)

相关推荐

  • java实现小i机器人api接口调用示例

    复制代码 代码如下: package com.weixin.util; import java.io.IOException;import java.util.Random;import org.apache.commons.codec.binary.Hex;import org.apache.commons.codec.digest.DigestUtils;import org.apache.commons.httpclient.HttpClient;import org.apache.com

  • java计算机器人的运动范围

    机器人的运动范围java版,具体内容如下 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18.但是,它不能进入方格(35,38),因为3+5+3+8 = 19.请问该机器人能够达到多少个格子? 解题思路: 1.首先判断当前位置是否满足进入条件,若满足可进入条件,则继续判断其周围上下左右的四个位置(除边界外

  • java数据结构实现机器人行走

    某少年宫引进了一批机器人小车.可以接受预先输入的指令,按指令行动.小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字). 例如,我们可以对小车输入如下的指令: 15L10R5LRR10R20 则,小车先直行15厘米,左转,再走10厘米,再右转,... 不难看出,对于此指令串,小车又回到了出发地. 你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离. [输入.输出格式要求] 用户先输入一个整数n(n<100),

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

    很多时候,我们希望能够实现自动测试,自动演示功能,或者是其它的一些鼠标和键盘控制的应用(比如帮人点击广告赚利润等).出于这样的目的,自从JDK1.3开始,它就为我们提供了一个用来产生本机输入事件的机器人类 - java.awt.Robot. 下面我来详细介绍Robot的功能及应用示例: 一.Robot主要的功能 1. BufferedImage createScreenCapture(Rectangle screenRect) 说明:该方法提供类似于键盘上的PrintScreen键的功能,将指定

  • Java实现的n阶曲线拟合功能示例

    本文实例讲述了Java实现的n阶曲线拟合功能.分享给大家供大家参考,具体如下: 前面一篇文章Java实现求解一元n次多项式的方法,能解多项式以后,还需要利用那个类,根据若干采样点数据来对未来数据进行预测,拟合的矩阵在上一篇文章中已经贴出来了,这里就不说了,本篇主要是如何根据采样点来计算系数矩阵,并计算预测点的值. 原理很简单,公式在上一篇文章中也有了,此处直接贴代码. 其中用到了上一篇文章中写的类commonAlgorithm.PolynomiaSoluter package commonAlg

  • Java开发实现的Socket双向通信功能示例

    本文实例讲述了Java开发实现的Socket双向通信功能.分享给大家供大家参考,具体如下: 服务端 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java

  • Java Swing实现的定制TextField功能示例

    本文实例讲述了Java Swing实现的定制TextField功能.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: package themedemo; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Insets;

  • Java spring boot 实现支付宝支付功能的示例代码

    一.准备工作: 1.登陆支付宝开发者中心,申请一个开发者账号. 地址:https://openhome.alipay.com/ 2.进入研发服务: 3.点击链接进入工具下载页面: 4.点击下载对应版本的RSA公钥生成器: 5.生成公钥密钥(记录你的应用私钥): 6.在支付宝配置公钥(点击保存): 二.搭建demo 1.引入jia包: <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alip

  • 详解java 拼音首字母搜索内容功能的示例

    序 一款成熟的产品,首页的搜索功能除了正常的关键词匹配以外:还要考虑到用户忘记输入汉字或者用户想通过关键字首字母来进行搜索的操作. 这不,阿淼公司最近在做游戏盒子,其中包含很多游戏,有个需求就是要用户可以根据游戏名称首字母搜索游戏,如搜索 zwdzjs 可以搜索出来植物大战僵尸等:输入 hzw 可以搜索出来海贼王等. 功能如何实现?接下来阿淼就直接带大家实操. 1.导入依赖包 <dependency> <groupId>com.belerweb</groupId> &l

  • JAVA Netty实现聊天室+私聊功能的示例代码

    功能介绍 使用Netty框架实现聊天室功能,服务器可监控客户端上下限状态,消息转发.同时实现了点对点私聊功能.技术点我都在代码中做了备注,这里不再重复写了.希望能给想学习netty的同学一点参考. 服务器代码 服务器入口代码 package nio.test.netty.groupChat; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.chann

  • java实现简单解析XML文件功能示例

    本文实例讲述了java实现简单解析XML文件功能.分享给大家供大家参考,具体如下: package demo; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;

  • Java模拟计算机的整数乘积计算功能示例

    本文实例讲述了Java模拟计算机的整数乘积计算功能.分享给大家供大家参考,具体如下: 计算机计算整数乘积的原理: 实现代码: package math; public class two { /** * Fundamental method * f(n) = O(n^2) * @param a * @param b * @return */ public static int naiveMul(int a,int b){ int x = 0; //判断a中出现1的位置,每当出现1就将b的移位运算

  • Java Socket实现的传输对象功能示例

    本文实例讲述了Java Socket实现的传输对象功能.分享给大家供大家参考,具体如下: 前面两篇文章介绍了怎样建立Java Socket通信,这里说一下怎样使用Java Socket来传输对象. 首先需要一个普通的对象类,由于需要序列化这个对象以便在网络上传输,所以实现java.io.Serializable接口就是必不可少的了,如下: package com.googlecode.garbagecan.test.socket.sample3; public class User implem

随机推荐