Java Robot应用示例之机器人功能
很多时候,我们希望能够实现自动测试,自动演示功能,或者是其它的一些鼠标和键盘控制的应用(比如帮人点击广告赚利润等)。出于这样的目的,自从JDK1.3开始,它就为我们提供了一个用来产生本机输入事件的机器人类—java.awt.Robot.
下面我来详细介绍Robot的功能及应用示例:
一、Robot主要的功能
1.BufferedImagecreateScreenCapture(RectanglescreenRect)
说明:该方法提供类似于键盘上的PrintScreen键的功能,将指定矩形区域内的屏幕像素copy下来产生一个BufferedImage。
应用:我们可以将这个方法用在图形程序中,或是用它来实现远端屏幕传输,可做成远端电脑监控程序等.
2.voiddelay(intms)
说明:用来将当前的程序(thread)休眠(sleep)若干毫秒(ms)。
应用:可用来控制程序的延时。这个一般是必须的,因为你在两次间隔操作中肯定有延时。
3.ColorgetPixelColor(intx,inty)
说明:取得给定屏幕坐标像素位置的颜色值。
应用:就是取颜色RGB值,就不多说了。
4.voidkeyPress(intkeycode)
voidkeyRelease(intkeycode)
说明:这两个方法的作用一看便知,用来产生指定键的按键按下与抬起动作,相当于Win32API的keyb_event函数,即模拟键盘操作咯,具体keycode值就是KeyEvent.VK_C、KeyEvent.VK_D、KeyEvent.VK_CONTROL什么的,具体应用时直接看Eclipse提示就知道了。
应用:可用于程序的自动演示、测试等,非常有用。
5.voidmouseMove(intx,inty)
说明:将鼠标光标移动到指定的屏幕坐标。
应用:可用于程序的自动演示、测试等,配合其他的方法使用,是不可缺少的。
6.voidmousePress(intbuttons)
voidmouseRelease(intbuttons)
voidmouseWheel(intwheelAmt)
说明:上面的三种方法,产生指定鼠标按钮的按下,抬起,及滚轮动作,就是模拟鼠标操作咯,具体buttons的值有InputEvent.BUTTON1_MASK(鼠标左键)、InputEvent.BUTTON3_MASK(鼠标右键,如果是双键鼠标,请改用InputEvent.BUTTON2_MASK)等。
应用:一样也可用于程序的自动演示、测试等,配合其他方法使用,很重要。
二、应用实例
我写了两个比较小的应用实例,一个是简单的模拟测试,一个是自动点击广告赚利润的,下面分别演示。
首先编写一些公用的方法Common.java
packagecom.alexia;
importjava.awt.Rectangle;
importjava.awt.Robot;
importjava.awt.Toolkit;
importjava.awt.event.InputEvent;
importjava.awt.event.KeyEvent;
importjava.awt.image.BufferedImage;
importjavax.swing.Icon;
importjavax.swing.ImageIcon;
/**
*@descriptionRobot帮助类,实现基本的功能
*@authorAlexia
*@date2013/5/18
*
*/
publicclassCommon{
/**
*鼠标单击(左击),要双击就连续调用
*
*@paramr
*@paramx
*x坐标位置
*@paramy
*y坐标位置
*@paramdelay
*该操作后的延迟时间
*/
publicstaticvoidclickLMouse(Robotr,intx,inty,intdelay){
r.mouseMove(x,y);
r.mousePress(InputEvent.BUTTON1_MASK);
r.delay(10);
r.mouseRelease(InputEvent.BUTTON1_MASK);
r.delay(delay);
}
/**
*鼠标右击,要双击就连续调用
*
*@paramr
*@paramx
*x坐标位置
*@paramy
*y坐标位置
*@paramdelay
*该操作后的延迟时间
*/
publicstaticvoidclickRMouse(Robotr,intx,inty,intdelay){
r.mouseMove(x,y);
r.mousePress(InputEvent.BUTTON3_MASK);
r.delay(10);
r.mouseRelease(InputEvent.BUTTON3_MASK);
r.delay(delay);
}
/**
*键盘输入(一次只能输入一个字符)
*
*@paramr
*@paramks
*键盘输入的字符数组
*@paramdelay
*输入一个键后的延迟时间
*/
publicstaticvoidpressKeys(Robotr,int[]ks,intdelay){
for(inti=0;i
在示例之前,注意屏幕坐标位置如何确定,我是下载了一个小工具,用起来十分方便,建议大家使用
1.简单的模拟测试
packagecom.alexia;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.JOptionPane;
publicclassSimpleTest{
publicstaticvoidmain(String[]args)throwsException{
finalRobotrb=newRobot();
newThread(){
publicvoidrun(){
rb.delay(2000);//模拟回车
rb.keyPress(KeyEvent.VK_ENTER);
rb.keyRelease(KeyEvent.VK_ENTER);
}
}.start();
rb.delay(3000);
//设置开始菜单的大概位置
intx=40;
inty=Toolkit.getDefaultToolkit().getScreenSize().height-10;//鼠标移动到开始菜单,
rb.mouseMove(x,y);
rb.delay(500);
//单击开始菜单
Common.clickLMouse(rb,x,y,500);
rb.delay(1000);
//运行CMD命令cmdenter
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命令direnter
ks=newint[]{KeyEvent.VK_D,KeyEvent.VK_I,KeyEvent.VK_R,
KeyEvent.VK_ENTER};
Common.pressKeys(rb,ks,500);
rb.delay(1000);
//运行CLS命令clsenter
ks=newint[]{KeyEvent.VK_C,KeyEvent.VK_L,KeyEvent.VK_S,
KeyEvent.VK_ENTER};
Common.pressKeys(rb,ks,500);
rb.delay(1000);
//运行EXIT命令exitenter
ks=newint[]{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);
newThread(){
publicvoidrun(){
rb.delay(1000);//回车
rb.keyPress(KeyEvent.VK_ENTER);
rb.keyRelease(KeyEvent.VK_ENTER);
}
}.start();
JOptionPane.showMessageDialog(null,"演示完毕!");
}
}
2.点击网易广告赚取微薄利润
packagecom.alexia;
importjava.awt.AWTException;
importjava.awt.Desktop;
importjava.awt.Robot;
importjava.awt.event.KeyEvent;
importjava.io.IOException;
importjava.net.URI;
importjava.util.Random;
publicclassAutoClickAds{
privateRobotrobot;
privatevolatilebooleanstop=false;
/**CreatesanewinstanceofMain*/
publicAutoClickAds(){
try{
robot=newRobot();
}catch(AWTExceptionex){
ex.printStackTrace();
}
}
publicvoidinit(){
robot.delay(3000);
System.out.println("ClickAdsstart");
//在新的浏览器窗口或在已有的浏览器窗口打开指定的URL(JDK1.6以上)
Desktopdesktop=Desktop.getDesktop();
if(Desktop.isDesktopSupported()&&desktop.isSupported(Desktop.Action.BROWSE)){
URIuri=URI.create("http://lanxuezaipiao.blog.163.com/");
try{
desktop.browse(uri);
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
try{
run();
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
stop();
System.out.println("ClickAdsstoped");
}
publicvoidrun()throwsInterruptedException{
intcount=1;
while(!stop){
robot.delay(8000);
intx=576;
inty=567;
Randomr=newRandom();
Common.clickLMouse(robot,x,y,3000);
//输入向下箭头,实现翻页
int[]ks={KeyEvent.VK_DOWN};
for(inti=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},};
intb=r.nextInt(5);
x=a[b][0];
y=a[b][1];
Common.clickLMouse(robot,x,y,1000);
//输入向下箭头,实现翻页
for(inti=0;i<500;i++)
Common.pressKeys(robot,ks,0);
//输入向下箭头,实现翻页
int[]kups={KeyEvent.VK_UP};
for(inti=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+"个广告!");
}
}
publicsynchronizedvoidstop(){
stop=true;
}
/**
**@paramargsthecommandlinearguments
*
*@throwsInterruptedException
*/
publicstaticvoidmain(String[]args)throwsInterruptedException{
AutoClickAdsmc=newAutoClickAds();
mc.init();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。