加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

java 控制鼠标 键盘

(2009-02-24 17:13:01)
标签:

java

鼠标控制

键盘控制

it

分类: JAVA
java在windows消息控制方面没有C++,C#等有正宗优势,但也有方便的实现方法。主要是通过Robot类实现,这是Sun出于自动测试目的制造的类。可以实现键盘自动输入的事件,鼠标移动点击,完成屏幕上对运行中的应用程序进行直观操作,若将事件编码成脚本然后逐一执行就可以实现无人职守的自动输入效果,但要做到和接收到输入结果的程序进行更深层次的信息控制,java还是需要通过C++,C#进行一些辅助实现的。
程序脚本如下

public class MyRobot {
    Robot robot;
    EventMap eventMap;

   
    public void delay(int delay) {
        robot.delay(delay);
    }

    public int getAutoDelay() {
        return robot.getAutoDelay();
    }

   
    public void setAutoDelay(int autoDelay) {
        robot.setAutoDelay(autoDelay);
        if (autoDelay < 20)
            System.out.println("自动延迟时间太小,可能影响应用程序响应键盘鼠标事件的准确性!");
    }

    public MyRobot() {
        try {
            robot = new Robot();
            eventMap = new EventMap();
            setAutoDelay(30);
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }

   
    public void exec(String cmd, int delay) {
        try {
            System.out.println("执行: " + cmd);
            Runtime.getRuntime().exec(cmd);
            delay(1000);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

----- ----------

public class EventMap {
    public HashMap<String, Integer> keyEvent = new HashMap<String, Integer>();
    public HashMap<String, Integer> mouseEvent = new HashMap<String, Integer>();
    public HashMap<String, Integer> inputEvent = new HashMap<String, Integer>();
    public HashMap<String, String> vkMap = new HashMap<String, String>();
    public HashMap<String, String> vkShift = new HashMap<String, String>();

    public EventMap() {

        // 键盘事件对应值,参考javadoc文档 /docs/api/constant-values.html
        keyEvent.put("CHAR_UNDEFINED", 65535);
        keyEvent.put("KEY_FIRST", 400);
        keyEvent.put("KEY_LAST", 402);
        keyEvent.put("KEY_LOCATION_LEFT", 2);
        keyEvent.put("KEY_LOCATION_NUMPAD", 4);
        keyEvent.put("KEY_LOCATION_RIGHT", 3);
        keyEvent.put("KEY_LOCATION_STANDARD", 1);
        keyEvent.put("KEY_LOCATION_UNKNOWN", 0);
        keyEvent.put("KEY_PRESSED", 401);
        keyEvent.put("KEY_RELEASED", 402);
        keyEvent.put("KEY_TYPED", 400);
        keyEvent.put("VK_0", 48);
        keyEvent.put("VK_1", 49);
        keyEvent.put("VK_2", 50);
        keyEvent.put("VK_3", 51);
        keyEvent.put("VK_4", 52);
        keyEvent.put("VK_5", 53);
        keyEvent.put("VK_6", 54);
        keyEvent.put("VK_7", 55);
        keyEvent.put("VK_8", 56);
        keyEvent.put("VK_9", 57);
        keyEvent.put("VK_A", 65);
        keyEvent.put("VK_ACCEPT", 30);
        keyEvent.put("VK_ADD", 107);
        keyEvent.put("VK_AGAIN", 65481);
        keyEvent.put("VK_ALL_CANDIDATES", 256);
        keyEvent.put("VK_ALPHANUMERIC", 240);
        keyEvent.put("VK_ALT", 18);
        keyEvent.put("VK_ALT_GRAPH", 65406);
        keyEvent.put("VK_AMPERSAND", 150);
        keyEvent.put("VK_ASTERISK", 151);
        keyEvent.put("VK_AT", 512);
        keyEvent.put("VK_B", 66);
        keyEvent.put("VK_BACK_QUOTE", 192);
        keyEvent.put("VK_BACK_SLASH", 92);
        keyEvent.put("VK_BACK_SPACE", 8);
        keyEvent.put("VK_BEGIN", 65368);
        keyEvent.put("VK_BRACELEFT", 161);
        keyEvent.put("VK_BRACERIGHT", 162);
        keyEvent.put("VK_C", 67);
        keyEvent.put("VK_CANCEL", 3);
        keyEvent.put("VK_CAPS_LOCK", 20);
        keyEvent.put("VK_CIRCUMFLEX", 514);
        keyEvent.put("VK_CLEAR", 12);
        keyEvent.put("VK_CLOSE_BRACKET", 93);
        keyEvent.put("VK_CODE_INPUT", 258);
        keyEvent.put("VK_COLON", 513);
        keyEvent.put("VK_COMMA", 44);
        keyEvent.put("VK_COMPOSE", 65312);
        keyEvent.put("VK_CONTEXT_MENU", 525);
        keyEvent.put("VK_CONTROL", 17);
        keyEvent.put("VK_CONVERT", 28);
        keyEvent.put("VK_COPY", 65485);
        keyEvent.put("VK_CUT", 65489);
        keyEvent.put("VK_D", 68);
        keyEvent.put("VK_DEAD_ABOVEDOT", 134);
        keyEvent.put("VK_DEAD_ABOVERING", 136);
        keyEvent.put("VK_DEAD_ACUTE", 129);
        keyEvent.put("VK_DEAD_BREVE", 133);
        keyEvent.put("VK_DEAD_CARON", 138);
        keyEvent.put("VK_DEAD_CEDILLA", 139);
        keyEvent.put("VK_DEAD_CIRCUMFLEX", 130);
        keyEvent.put("VK_DEAD_DIAERESIS", 135);
        keyEvent.put("VK_DEAD_DOUBLEACUTE", 137);
        keyEvent.put("VK_DEAD_GRAVE", 128);
        keyEvent.put("VK_DEAD_IOTA", 141);
        keyEvent.put("VK_DEAD_MACRON", 132);
        keyEvent.put("VK_DEAD_OGONEK", 140);
        keyEvent.put("VK_DEAD_SEMIVOICED_SOUND", 143);
        keyEvent.put("VK_DEAD_TILDE", 131);
        keyEvent.put("VK_DEAD_VOICED_SOUND", 142);
        keyEvent.put("VK_DECIMAL", 110);
        keyEvent.put("VK_DELETE", 127);
        keyEvent.put("VK_DIVIDE", 111);
        keyEvent.put("VK_DOLLAR", 515);
        keyEvent.put("VK_DOWN", 40);
        keyEvent.put("VK_E", 69);
        keyEvent.put("VK_END", 35);
        keyEvent.put("VK_ENTER", 10);
        keyEvent.put("VK_EQUALS", 61);
        keyEvent.put("VK_ESCAPE", 27);
        keyEvent.put("VK_EURO_SIGN", 516);
        keyEvent.put("VK_EXCLAMATION_MARK", 517);
        keyEvent.put("VK_F", 70);
        keyEvent.put("VK_F1", 112);
        keyEvent.put("VK_F10", 121);
        keyEvent.put("VK_F11", 122);
        keyEvent.put("VK_F12", 123);
        keyEvent.put("VK_F13", 61440);
        keyEvent.put("VK_F14", 61441);
        keyEvent.put("VK_F15", 61442);
        keyEvent.put("VK_F16", 61443);
        keyEvent.put("VK_F17", 61444);
        keyEvent.put("VK_F18", 61445);
        keyEvent.put("VK_F19", 61446);
        keyEvent.put("VK_F2", 113);
        keyEvent.put("VK_F20", 61447);
        keyEvent.put("VK_F21", 61448);
        keyEvent.put("VK_F22", 61449);
        keyEvent.put("VK_F23", 61450);
        keyEvent.put("VK_F24", 61451);
        keyEvent.put("VK_F3", 114);
        keyEvent.put("VK_F4", 115);
        keyEvent.put("VK_F5", 116);
        keyEvent.put("VK_F6", 117);
        keyEvent.put("VK_F7", 118);
        keyEvent.put("VK_F8", 119);
        keyEvent.put("VK_F9", 120);
        keyEvent.put("VK_FINAL", 24);
        keyEvent.put("VK_FIND", 65488);
        keyEvent.put("VK_FULL_WIDTH", 243);
        keyEvent.put("VK_G", 71);
        keyEvent.put("VK_GREATER", 160);
        keyEvent.put("VK_H", 72);
        keyEvent.put("VK_HALF_WIDTH", 244);
        keyEvent.put("VK_HELP", 156);
        keyEvent.put("VK_HIRAGANA", 242);
        keyEvent.put("VK_HOME", 36);
        keyEvent.put("VK_I", 73);
        keyEvent.put("VK_INPUT_METHOD_ON_OFF", 263);
        keyEvent.put("VK_INSERT", 155);
        keyEvent.put("VK_INVERTED_EXCLAMATION_MARK", 518);
        keyEvent.put("VK_J", 74);
        keyEvent.put("VK_JAPANESE_HIRAGANA", 260);
        keyEvent.put("VK_JAPANESE_KATAKANA", 259);
        keyEvent.put("VK_JAPANESE_ROMAN", 261);
        keyEvent.put("VK_K", 75);
        keyEvent.put("VK_KANA", 21);
        keyEvent.put("VK_KANA_LOCK", 262);
        keyEvent.put("VK_KANJI", 25);
        keyEvent.put("VK_KATAKANA", 241);
        keyEvent.put("VK_KP_DOWN", 225);
        keyEvent.put("VK_KP_LEFT", 226);
        keyEvent.put("VK_KP_RIGHT", 227);
        keyEvent.put("VK_KP_UP", 224);
        keyEvent.put("VK_L", 76);
        keyEvent.put("VK_LEFT", 37);
        keyEvent.put("VK_LEFT_PARENTHESIS", 519);
        keyEvent.put("VK_LESS", 153);
        keyEvent.put("VK_M", 77);
        keyEvent.put("VK_META", 157);
        keyEvent.put("VK_MINUS", 45);
        keyEvent.put("VK_MODECHANGE", 31);
        keyEvent.put("VK_MULTIPLY", 106);
        keyEvent.put("VK_N", 78);
        keyEvent.put("VK_NONCONVERT", 29);
        keyEvent.put("VK_NUM_LOCK", 144);
        keyEvent.put("VK_NUMBER_SIGN", 520);
        keyEvent.put("VK_NUMPAD0", 96);
        keyEvent.put("VK_NUMPAD1", 97);
        keyEvent.put("VK_NUMPAD2", 98);
        keyEvent.put("VK_NUMPAD3", 99);
        keyEvent.put("VK_NUMPAD4", 100);
        keyEvent.put("VK_NUMPAD5", 101);
        keyEvent.put("VK_NUMPAD6", 102);
        keyEvent.put("VK_NUMPAD7", 103);
        keyEvent.put("VK_NUMPAD8", 104);
        keyEvent.put("VK_NUMPAD9", 105);
        keyEvent.put("VK_O", 79);
        keyEvent.put("VK_OPEN_BRACKET", 91);
        keyEvent.put("VK_P", 80);
        keyEvent.put("VK_PAGE_DOWN", 34);
        keyEvent.put("VK_PAGE_UP", 33);
        keyEvent.put("VK_PASTE", 65487);
        keyEvent.put("VK_PAUSE", 19);
        keyEvent.put("VK_PERIOD", 46);
        keyEvent.put("VK_PLUS", 521);
        keyEvent.put("VK_PREVIOUS_CANDIDATE", 257);
        keyEvent.put("VK_PRINTSCREEN", 154);
        keyEvent.put("VK_PROPS", 65482);
        keyEvent.put("VK_Q", 81);
        keyEvent.put("VK_QUOTE", 222);
        keyEvent.put("VK_QUOTEDBL", 152);
        keyEvent.put("VK_R", 82);
        keyEvent.put("VK_RIGHT", 39);
        keyEvent.put("VK_RIGHT_PARENTHESIS", 522);
        keyEvent.put("VK_ROMAN_CHARACTERS", 245);
        keyEvent.put("VK_S", 83);
        keyEvent.put("VK_SCROLL_LOCK", 145);
        keyEvent.put("VK_SEMICOLON", 59);
        keyEvent.put("VK_SEPARATER", 108);
        keyEvent.put("VK_SEPARATOR", 108);
        keyEvent.put("VK_SHIFT", 16);
        keyEvent.put("VK_SLASH", 47);
        keyEvent.put("VK_SPACE", 32);
        keyEvent.put("VK_STOP", 65480);
        keyEvent.put("VK_SUBTRACT", 109);
        keyEvent.put("VK_T", 84);
        keyEvent.put("VK_TAB", 9);
        keyEvent.put("VK_U", 85);
        keyEvent.put("VK_UNDEFINED", 0);
        keyEvent.put("VK_UNDERSCORE", 523);
        keyEvent.put("VK_UNDO", 65483);
        keyEvent.put("VK_UP", 38);
        keyEvent.put("VK_V", 86);
        keyEvent.put("VK_W", 87);
        keyEvent.put("VK_WINDOWS", 524);
        keyEvent.put("VK_X", 88);
        keyEvent.put("VK_Y", 89);
        keyEvent.put("VK_Z", 90);

        mouseEvent.put("BUTTON1", 1);
        mouseEvent.put("BUTTON2", 2);
        mouseEvent.put("BUTTON3", 3);
        mouseEvent.put("MOUSE_CLICKED", 500);
        mouseEvent.put("MOUSE_DRAGGED", 506);
        mouseEvent.put("MOUSE_ENTERED", 504);
        mouseEvent.put("MOUSE_EXITED", 505);
        mouseEvent.put("MOUSE_FIRST", 500);
        mouseEvent.put("MOUSE_LAST", 507);
        mouseEvent.put("MOUSE_MOVED", 503); // 鼠标移动
        mouseEvent.put("MOUSE_PRESSED", 501); // 鼠标键按下
        mouseEvent.put("MOUSE_RELEASED", 502); // 鼠标键抬起
        mouseEvent.put("MOUSE_WHEEL", 507);
        mouseEvent.put("NOBUTTON", 0);
        mouseEvent.put("WHEEL_BLOCK_SCROLL", 1);
        mouseEvent.put("WHEEL_UNIT_SCROLL", 0);

        // 鼠标输入时间
        inputEvent.put("ALT_DOWN_MASK", 512);
        inputEvent.put("ALT_GRAPH_DOWN_MASK", 8192);
        inputEvent.put("ALT_GRAPH_MASK", 32);
        inputEvent.put("ALT_MASK", 8);
        inputEvent.put("BUTTON1_DOWN_MASK", 1024);
        inputEvent.put("BUTTON1_MASK", 16); // 鼠标左键
        inputEvent.put("BUTTON2_DOWN_MASK", 2048);
        inputEvent.put("BUTTON2_MASK", 8); // 鼠标中键
        inputEvent.put("BUTTON3_DOWN_MASK", 4096);
        inputEvent.put("BUTTON3_MASK", 4); // 鼠标右键
        inputEvent.put("CTRL_DOWN_MASK", 128);
        inputEvent.put("CTRL_MASK", 2);
        inputEvent.put("META_DOWN_MASK", 256);
        inputEvent.put("META_MASK", 4);
        inputEvent.put("SHIFT_DOWN_MASK", 64);
        inputEvent.put("SHIFT_MASK", 1);

        // vkMap用于读取连续字符串解析对应键值
        vkMap.put("a", "VK_A");
        vkMap.put("b", "VK_B");
        vkMap.put("c", "VK_C");
        vkMap.put("d", "VK_D");
        vkMap.put("e", "VK_E");
        vkMap.put("f", "VK_F");
        vkMap.put("g", "VK_G");
        vkMap.put("h", "VK_H");
        vkMap.put("i", "VK_I");
        vkMap.put("j", "VK_J");
        vkMap.put("k", "VK_K");
        vkMap.put("l", "VK_L");
        vkMap.put("m", "VK_M");
        vkMap.put("n", "VK_N");
        vkMap.put("o", "VK_O");
        vkMap.put("p", "VK_P");
        vkMap.put("q", "VK_Q");
        vkMap.put("r", "VK_R");
        vkMap.put("s", "VK_S");
        vkMap.put("t", "VK_T");
        vkMap.put("u", "VK_U");
        vkMap.put("v", "VK_V");
        vkMap.put("w", "VK_W");
        vkMap.put("x", "VK_X");
        vkMap.put("y", "VK_Y");
        vkMap.put("z", "VK_Z");

        vkMap.put("`", "VK_BACK_QUOTE");
        vkMap.put("1", "VK_1");
        vkMap.put("2", "VK_2");
        vkMap.put("3", "VK_3");
        vkMap.put("4", "VK_4");
        vkMap.put("5", "VK_5");
        vkMap.put("6", "VK_6");
        vkMap.put("7", "VK_7");
        vkMap.put("8", "VK_8");
        vkMap.put("9", "VK_9");
        vkMap.put("0", "VK_0");
        vkMap.put("-", "VK_MINUS");
        vkMap.put("=", "VK_EQUALS");
        vkMap.put("[", "VK_OPEN_BRACKET");
        vkMap.put("]", "VK_CLOSE_BRACKET");
        vkMap.put("\\", "VK_BACK_SLASH");
        vkMap.put(";", "VK_SEMICOLON");
        vkMap.put("'", "VK_QUOTE");
        vkMap.put(",", "VK_COMMA");
        vkMap.put(".", "VK_PERIOD");
        vkMap.put("/", "VK_SLASH");
        vkMap.put(" ", "VK_SPACE");

        // 控制类键的对应字符解析定义
        vkMap.put("上", "VK_UP");
        vkMap.put("下", "VK_DOWN");
        vkMap.put("左", "VK_LEFT");
        vkMap.put("右", "VK_RIGHT");
        vkMap.put("头", "VK_HOME");
        vkMap.put("尾", "VK_END");
        vkMap.put("【", "VK_PAGE_UP");
        vkMap.put("】", "VK_PAGE_DOWN");

        vkMap.put("■", "VK_CAPS_LOCK"); // 大写键
        vkMap.put("数", "VK_NUM_LOCK"); // 数字键
        vkMap.put("①", "VK_F1"); // 功能键1
        vkMap.put("②", "VK_F2"); // 功能键2
        vkMap.put("③", "VK_F3"); // 功能键3
        vkMap.put("④", "VK_F4"); // 功能键4
        vkMap.put("⑤", "VK_F5"); // 功能键5
        vkMap.put("⑥", "VK_F6"); // 功能键6
        vkMap.put("⑦", "VK_F7"); // 功能键7
        vkMap.put("⑧", "VK_F8"); // 功能键8
        vkMap.put("⑨", "VK_F9"); // 功能键9
        vkMap.put("⑩", "VK_F10"); // 功能键10

        vkMap.put("▲", "VK_SHIFT"); // press <shift>
        vkMap.put("△", "VK_SHIFT"); // release <shift>
        vkMap.put("◆", "VK_ALT");// press <alt>
        vkMap.put("◇", "VK_ALT");// release <alt>
        vkMap.put("●", "VK_CONTROL");// press <ctrl>
        vkMap.put("○", "VK_CONTROL");// release <ctrl>

        vkMap.put("悔", "VK_ESCAPE");
        vkMap.put("⊥", "VK_TAB"); // 制表符 输入方法:垂直
        vkMap.put("完", "VK_ENTER"); // 回车“”
        vkMap.put("插", "VK_INSERT");
        vkMap.put("删", "VK_DELETE");
        vkMap.put("退", "VK_BACK_SPACE");
        vkMap.put("停", "VK_PAUSE");

       
        vkMap.put("→", "65");
        vkMap.put("↗", "64");
        vkMap.put("↑", "54");
        vkMap.put("↖", "44");
        vkMap.put("←", "45");
        vkMap.put("↙", "46");
        vkMap.put("↓", "56");
        vkMap.put("↘", "66");

        vkMap.put("≥", ""); // 鼠标右键单击
        vkMap.put("≤", ""); // 鼠标左键单击

        // 鼠标移动步长
        vkMap.put("⑴", "1");
        vkMap.put("⑵", "2");
        vkMap.put("⑶", "3");
        vkMap.put("⑷", "4");
        vkMap.put("⑸", "5");
        vkMap.put("⑹", "6");
        vkMap.put("⑺", "7");
        vkMap.put("⑻", "8");
        vkMap.put("⑼", "9");
        vkMap.put("⑽", "10");
        vkMap.put("⑾", "11");
        vkMap.put("⑿", "12");
        vkMap.put("⒀", "13");
        vkMap.put("⒁", "14");
        vkMap.put("⒂", "15");
        vkMap.put("⒃", "16");
        vkMap.put("⒄", "17");
        vkMap.put("⒅", "18");
        vkMap.put("⒆", "19");
        vkMap.put("⒇", "20");

        // 等待n秒
        vkMap.put("等", "1"); // delay 1s
        vkMap.put("候", "3"); // delay 3s
        vkMap.put("歇", "5"); // delay 5s
        vkMap.put("息", "10"); // delay 10s
        vkMap.put("睡", "30"); // delay 30s
        vkMap.put("眠", "60"); // delay 60s

        // 输入下列字符时 ~!@#$%^&*()_+{}|:"<>? 需要配合shift键消息
        vkShift.put("~", "▲`△"); // shift -> `
        vkShift.put("!", "▲1△"); // shift -> 1
        vkShift.put("@", "▲2△"); // shift -> 2
        vkShift.put("#", "▲3△"); // shift -> 3
        vkShift.put("$", "▲4△"); // shift -> 4
        vkShift.put("%", "▲5△"); // shift -> 5
        vkShift.put("^", "▲6△"); // shift -> 6
        vkShift.put("&", "▲7△"); // shift -> 7
        vkShift.put("*", "▲8△"); // shift -> 8
        vkShift.put("(", "▲9△"); // shift -> 9
        vkShift.put(")", "▲0△"); // shift -> 0
        vkShift.put("_", "▲-△"); // shift -> -
        vkShift.put("+", "▲=△"); // shift -> =
        vkShift.put("{", "▲[△"); // shift -> [
        vkShift.put("}", "▲]△"); // shift -> ]
        vkShift.put("|", "▲\\△"); // shift -> \
        vkShift.put(":", "▲;△"); // shift -> ;
        vkShift.put("\"", "▲'△"); // shift -> '
        vkShift.put("<", "▲,△"); // shift -> ,
        vkShift.put(">", "▲.△"); // shift -> .
        vkShift.put("?", "▲/△"); // shift -> /

    }
}



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有