鼠标键盘动作的模拟

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gsl371/article/details/80297686

官方JavaDocsApi:

java.awt.Robot
Robot,机器人。此类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot 的主要目的是便于 Java 平台实现自动测试。
Robot 可以模拟鼠标和键盘的输入,相当于 Java 版的按键精灵。
按键事件可以利用键盘来控制和执行一些动作,或者从键盘上获取输入,只要按下,释放一个键或者在一个组件上敲击,就会触发按键事件。KeyEvent对象描述事件的特性(按下,放开,或者敲击一个键)和对应的值。java提供KeyListener接口处理按键事件。
当按下一个键时会调用KeyPressed处理器,当松开一个键时会调用KeyReleased处理器,当输入一个统一编码时会调用KeyTyped处理器。如果这个键不是统一码(如功能键,修改键,动作键和控制键)
每个按键事件有一个相关的按键字符和按键代码,分别由KeyEvent中的getKeyChar()和getKeyCode()方法返回

 getKeyChar():  char           返回这个事件中和键相关的字符
 getKeyCode():  int             返回这个事件中和键相关的整数键

keyPressed(e: KeyEvent) 在源组件上按下一个键后被调用
KeyReleased(e: KeyEvent) 在源组件上释放一个键后被调用
KeyTyped(e: KeyEvent) 在源组件上按下一个键然后释放该键后被调用

Robot 构造方法:

// 在基本屏幕坐标系中构造一个 Robot 对象, 如果平台不支持 Robot, 将抛出异常
Robot()

// 为给定屏幕设备创建一个 Robot(用于同时使用多个显示设备的情况)
Robot(GraphicsDevice screen)

模拟鼠标的方法:

// 将鼠标指针移动到指定屏幕坐标
void mouseMove(int x, int y)

/**
 * 按下/释放一个或多个鼠标按钮, 参数说明:
 *     buttons: 鼠标按钮掩码, 一个或多个以下标志的组合:
 *              InputEvent.BUTTON1_MASK 鼠标左键
 *              InputEvent.BUTTON2_MASK 鼠标中键
 *              InputEvent.BUTTON3_MASK 鼠标右键
 */
void mousePress(int buttons)
void mouseRelease(int buttons)

// 在配有滚轮的鼠标上旋转滚轮
void mouseWheel(int wheelAmt)

模拟键盘的方法:

/**
 * 按下/释放键盘按键, 参数说明:
 *     keycode: 键盘键值常量, 定义在 KeyEvent.VK_XXX 中
 */
void keyPress(int keycode)
void keyRelease(int keycode)

屏幕相关方法:

// 获取指定屏幕坐标处的像素颜色
Color getPixelColor(int x, int y)

// 截屏, 截取指定的矩形区域

BufferedImage createScreenCapture(Rectangle screenRect)

控制类方法:

// 睡眠指定的时间, 相当于 Thread.sleep(long ms)
void delay(int ms)

// 在处理完当前事件队列中的所有事件之前, 一直等待
void waitForIdle()

// 设置此 Robot 在生成一个事件后是否自动调用 waitForIdle()
// 设置为 true, 表示添加的事件逐个按顺序执行(执行完一个再执行下一个)
void setAutoWaitForIdle(boolean isOn)
boolean isAutoWaitForIdle()

// 设置此 Robot 每在生成一个事件后自动睡眠的毫秒数
void setAutoDelay(int ms)
int getAutoDelay()

开发实例

声明robot类需要抛出异常,如果配应用的对象支持键盘操作,做好以键盘操作为准,鼠标操作有时定位不准会造成失败。

package com.gsl;

import java.awt.Color;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class Main {  
    private static Robot robot;  

    public static void main(String[] args) {  
        try {  
            robot = new Robot();//创建Robot对象  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  

       //根据色彩变化来执行下一步
        boolean bc1;
        do 
        {
            Color c = robot.getPixelColor(1800, 180);
            Color c1 = new Color(255,255,255);
            bc1 = c1.equals(c);
           // System.out.println(bc1);
        }while (bc1);

      //移动鼠标选择text
      //  robot.mouseMove(914,752);  
        robot.keyPress(KeyEvent.VK_TAB);  
        robot.keyRelease(KeyEvent.VK_TAB);  
        robot.delay(500);  
        //输入值200000 20wan

        robot.keyPress(KeyEvent.VK_2);  
        robot.keyRelease(KeyEvent.VK_2);  
     //   robot.delay(200);  
        robot.keyPress(KeyEvent.VK_0);  
        robot.keyRelease(KeyEvent.VK_0);  
   //     robot.delay(200);  
        robot.keyPress(KeyEvent.VK_0);  
        robot.keyRelease(KeyEvent.VK_0);  
     //   robot.delay(200);  
        robot.keyPress(KeyEvent.VK_0);  
        robot.keyRelease(KeyEvent.VK_0);  
     //   robot.delay(200);  
        robot.keyPress(KeyEvent.VK_0);  
        robot.keyRelease(KeyEvent.VK_0);  
    //    robot.delay(200); 
        robot.keyPress(KeyEvent.VK_0);  
        robot.keyRelease(KeyEvent.VK_0);  
    //    robot.delay(200);  
        //move foucs to combox
        robot.keyPress(KeyEvent.VK_TAB);  
        robot.keyRelease(KeyEvent.VK_TAB);  
        robot.delay(100);  
        //press down-key 2times select cash
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(100);  
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(100); 
        robot.keyPress(KeyEvent.VK_ENTER);  
        robot.keyRelease(KeyEvent.VK_ENTER);  
        robot.delay(100);  

        //move foucs to button sure
        robot.keyPress(KeyEvent.VK_TAB);  
        robot.keyRelease(KeyEvent.VK_TAB);  
        robot.delay(100); 
        /*
        robot.keyPress(KeyEvent.VK_ENTER);  
        robot.keyRelease(KeyEvent.VK_ENTER);  
        robot.delay(100); 
        */

        robot.mouseMove(0,0);
        robot.mouseMove(732,604);
        //按下和释放鼠标右键,选定工程  
        robot.mousePress(KeyEvent.BUTTON1_MASK);  
        robot.mouseRelease(KeyEvent.BUTTON1_MASK); 

        /*
        //这里是按下和释放alt键,这个键的功能是调用菜单  
        robot.keyPress(KeyEvent.VK_ALT);  
        robot.keyRelease(KeyEvent.VK_ALT);  
        robot.delay(500);//延迟500ms  
        //这里是按下和释放回车键,用于确定是file选项  
        robot.keyPress(KeyEvent.VK_ENTER);  
        robot.keyRelease(KeyEvent.VK_ENTER);  
        robot.delay(500);  

        //选择New  
        robot.keyPress(KeyEvent.VK_ENTER);  
        robot.keyRelease(KeyEvent.VK_ENTER);  
        robot.delay(500);  

        //选择Java Project  
        robot.keyPress(KeyEvent.VK_ENTER);  
        robot.keyRelease(KeyEvent.VK_ENTER);  
        robot.delay(500);  

        //输入字母a,即工程名  
        robot.keyPress(KeyEvent.VK_A);  
        robot.keyRelease(KeyEvent.VK_A);  
        robot.delay(500);  

        //回车确定创建工程  
        robot.keyPress(KeyEvent.VK_ENTER);        
        robot.keyRelease(KeyEvent.VK_ENTER);          
        robot.delay(500);   

        //将鼠标抵用到刚刚建立的工程上面,这个坐标是作者在自己的电脑上实验获得的,在不同的电脑上可能不一样,可以用  
        //Point point = MouseInfo.getPointerInfo().getLocation();  
        //System.out.println(point);来打印当前鼠标的坐标,从而找到对的位置  
        robot.mouseMove(32, 136);  
        //按下和释放鼠标右键,选定工程  
        robot.mousePress(KeyEvent.BUTTON1_MASK);  
        robot.mouseRelease(KeyEvent.BUTTON1_MASK);  

        //alt键选择菜单并调出newClass的选项  
        robot.keyPress(KeyEvent.VK_ALT);  
        robot.keyRelease(KeyEvent.VK_ALT);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_ENTER);  
        robot.keyRelease(KeyEvent.VK_ENTER);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_ENTER);  
        robot.keyRelease(KeyEvent.VK_ENTER);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_ENTER);  
        robot.keyRelease(KeyEvent.VK_ENTER);  
        robot.delay(500);  
        //下面换回小写  
        //切换成大写  
        robot.keyPress(KeyEvent.VK_CAPS_LOCK);  
        robot.keyRelease(KeyEvent.VK_CAPS_LOCK);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_H);  
        robot.keyRelease(KeyEvent.VK_H);  
        robot.delay(200);  
        //换回小写  
        robot.keyPress(KeyEvent.VK_CAPS_LOCK);  
        robot.keyRelease(KeyEvent.VK_CAPS_LOCK);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_E);  
        robot.keyRelease(KeyEvent.VK_E);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_L);  
        robot.keyRelease(KeyEvent.VK_L);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_L);  
        robot.keyRelease(KeyEvent.VK_L);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_O);  
        robot.keyRelease(KeyEvent.VK_O);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_CAPS_LOCK);  
        robot.keyRelease(KeyEvent.VK_CAPS_LOCK);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_W);  
        robot.keyRelease(KeyEvent.VK_W);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_CAPS_LOCK);  
        robot.keyRelease(KeyEvent.VK_CAPS_LOCK);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_O);  
        robot.keyRelease(KeyEvent.VK_O);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_R);  
        robot.keyRelease(KeyEvent.VK_R);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_L);  
        robot.keyRelease(KeyEvent.VK_L);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_D);  
        robot.keyRelease(KeyEvent.VK_D);  
        robot.delay(200);  

        //移动鼠标选择自动穿件main函数  
        robot.mouseMove(650, 448);  
        robot.mousePress(KeyEvent.BUTTON1_MASK);  
        robot.mouseRelease(KeyEvent.BUTTON1_MASK);  
        robot.delay(500);  

        //回车创建完成  
        robot.keyPress(KeyEvent.VK_ENTER);  
        robot.keyRelease(KeyEvent.VK_ENTER);  
        robot.delay(500); 

        //移动光标到输入代码的行上  
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_DOWN);  
        robot.keyRelease(KeyEvent.VK_DOWN);  
        robot.delay(500);  

        //输入syso并用alt+/快捷键补全  
        robot.keyPress(KeyEvent.VK_S);  
        robot.keyRelease(KeyEvent.VK_S);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_Y);  
        robot.keyRelease(KeyEvent.VK_Y);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_S);  
        robot.keyRelease(KeyEvent.VK_S);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_O);  
        robot.keyRelease(KeyEvent.VK_O);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_ALT);  
        robot.keyPress(KeyEvent.VK_SLASH);  
        robot.keyRelease(KeyEvent.VK_ALT);  
        robot.keyRelease(KeyEvent.VK_SLASH);  
        robot.delay(500);  
      //回车创建完成  
        robot.keyPress(KeyEvent.VK_ENTER);  
        robot.keyRelease(KeyEvent.VK_ENTER);  
        robot.delay(500); 

        //输入双引号  
        robot.keyPress(KeyEvent.VK_SHIFT);  
        robot.keyPress(KeyEvent.VK_QUOTE);  
        robot.keyRelease(KeyEvent.VK_SHIFT);  
        robot.keyRelease(KeyEvent.VK_QUOTE);  

        //输入HelloWorld  
        robot.keyPress(KeyEvent.VK_CAPS_LOCK);  
        robot.keyRelease(KeyEvent.VK_CAPS_LOCK);  
        robot.delay(500);  
        robot.keyPress(KeyEvent.VK_H);  
        robot.keyRelease(KeyEvent.VK_H);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_CAPS_LOCK);  
        robot.keyRelease(KeyEvent.VK_CAPS_LOCK);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_E);  
        robot.keyRelease(KeyEvent.VK_E);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_L);  
        robot.keyRelease(KeyEvent.VK_L);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_L);  
        robot.keyRelease(KeyEvent.VK_L);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_O);  
        robot.keyRelease(KeyEvent.VK_O);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_CAPS_LOCK);  
        robot.keyRelease(KeyEvent.VK_CAPS_LOCK);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_W);  
        robot.keyRelease(KeyEvent.VK_W);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_CAPS_LOCK);  
        robot.keyRelease(KeyEvent.VK_CAPS_LOCK);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_O);  
        robot.keyRelease(KeyEvent.VK_O);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_R);  
        robot.keyRelease(KeyEvent.VK_R);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_L);  
        robot.keyRelease(KeyEvent.VK_L);  
        robot.delay(200);  
        robot.keyPress(KeyEvent.VK_D);  
        robot.keyRelease(KeyEvent.VK_D);  
        robot.delay(200);  

        //ctrl+shift+F 格式化  
        robot.keyPress(KeyEvent.VK_SHIFT);  
        robot.keyPress(KeyEvent.VK_CONTROL);  
        robot.keyPress(KeyEvent.VK_F);  
        robot.keyRelease(KeyEvent.VK_SHIFT);  
        robot.keyRelease(KeyEvent.VK_CONTROL);  
        robot.keyRelease(KeyEvent.VK_F);  

        //ctrl+S保存  
        robot.keyPress(KeyEvent.VK_CONTROL);  
        robot.keyPress(KeyEvent.VK_S);  
        robot.keyRelease(KeyEvent.VK_S);  
        robot.keyRelease(KeyEvent.VK_CONTROL);  

        //F11运行  
        robot.keyPress(KeyEvent.VK_F11);  
        robot.keyRelease(KeyEvent.VK_F11);        
          */
    }     
}

按键常量

VK_HOME Home键
VK_CONTROL 控制键
VK_END End键
VK_SHIFT shift键
VK_PGUP page up键
VK_BACK_SPACE 退格键
VK_PGDN page down键
VK_CAPS_LOCK 大小写锁定键
VK_UP 上箭头
VK_NUM_LOCK 小键盘锁定键
VK_DOWN 下箭头
VK_ENTER 回车键
VK_LEFT 左箭头
VK_UNDEFINED 未知键
VK_RIGHT 右箭头
VK_F1–VK_F12 F1 – F12
VK_ESCAPE Esc键
VK_0 –VK_9 0 — 9
VK_TAB Tab键
VK_A –VK_Z A—-Z

工具

1、 RGB颜色值与十六进制颜色码转换工具
http://www.sioe.cn/yingyong/yanse-rgb-16/
2、屏幕坐标和像素捕捉工具
这里写图片描述
3、jdk api
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

问题

mouseMove位置问题

屏幕中最终会的位置和程序中设置的位置不一致
1、添加鼠标位置复位

robot.mouseMove(0,0);
robot.mouseMove(732,604);

2、win10等显示缩放引起像素位置不一致
这里写图片描述
在程序中根据实际测得的数值,进行同比例的缩放后设置值。

猜你喜欢

转载自blog.csdn.net/gsl371/article/details/80297686