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(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: python scrapy框架爬取80s保存mysql
下一篇: 有效提升网站运营效率的方法有哪些?