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(); } }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。