/*
* Copyright 2014, Synthuse.org
* Released under the Apache Version 2.0 License.
*
* last modified by ejakubowski
*/
package org.synthuse;
import java.awt.*;
import java.awt.event.*;
public class RobotMacro {
public static Exception lastException = null;
public static boolean executeCommand(String cmd) {
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec(cmd);
} catch (Exception e) {
lastException = e;
return false;
}
return true;
}
public static void delay(int time) {
try {
Robot robot = new Robot();
robot.delay(time);
} catch (Exception e) {
lastException = e;
}
}
public static void moveMouse(int x, int y) {
try {
Robot robot = new Robot();
robot.mouseMove(x, y);
} catch (Exception e) {
lastException = e;
}
}
public static void leftClickMouse() {
try {
Robot robot = new Robot();
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
} catch (Exception e) {
lastException = e;
}
}
public static void doubleClickMouse() {
try {
Robot robot = new Robot();
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
robot.delay(100);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
} catch (Exception e) {
lastException = e;
}
}
public static void rightClickMouse() {
try {
//System.out.println("rightClickMouse");
Robot robot = new Robot();
//robot.mouseMove(200, 200);
//robot.delay(1000);
robot.mousePress(InputEvent.BUTTON3_MASK);
robot.mouseRelease(InputEvent.BUTTON3_MASK);
//System.out.println("rightClickMouse good");
} catch (Exception e) {
lastException = e;
e.printStackTrace();
}
}
public static void leftMouseDown() {
try {
Robot robot = new Robot();
robot.mousePress(InputEvent.BUTTON1_MASK);
} catch (Exception e) {
lastException = e;
}
}
public static void leftMouseUp() {
try {
Robot robot = new Robot();
robot.mouseRelease(InputEvent.BUTTON1_MASK);
} catch (Exception e) {
lastException = e;
}
}
public static void rightMouseDown() {
try {
Robot robot = new Robot();
robot.mousePress(InputEvent.BUTTON3_MASK);
} catch (Exception e) {
lastException = e;
}
}
public static void rightMouseUp() {
try {
Robot robot = new Robot();
robot.mouseRelease(InputEvent.BUTTON3_MASK);
} catch (Exception e) {
lastException = e;
e.printStackTrace();
}
}
public static void mouseMove(int x, int y) {
try {
Robot robot = new Robot();
robot.mouseMove(x, y);
} catch (Exception e) {
lastException = e;
e.printStackTrace();
}
}
public static void copyKey() {
try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
} catch (Exception e) {
lastException = e;
}
}
public static void pasteKey() {
try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
} catch (Exception e) {
lastException = e;
}
}
public static void escapeKey() {
try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ESCAPE);
robot.keyRelease(KeyEvent.VK_ESCAPE);
} catch (Exception e) {
lastException = e;
}
}
public static void functionKey(int functionNum) {
try {
Robot robot = new Robot();
int keyCode = 0;
switch (functionNum) {
case 1: keyCode = KeyEvent.VK_F1; break;
case 2: keyCode = KeyEvent.VK_F2; break;
case 3: keyCode = KeyEvent.VK_F3; break;
case 4: keyCode = KeyEvent.VK_F4; break;
case 5: keyCode = KeyEvent.VK_F5; break;
case 6: keyCode = KeyEvent.VK_F6; break;
case 7: keyCode = KeyEvent.VK_F7; break;
case 8: keyCode = KeyEvent.VK_F8; break;
case 9: keyCode = KeyEvent.VK_F9; break;
case 10: keyCode = KeyEvent.VK_F10; break;
case 11: keyCode = KeyEvent.VK_F11; break;
case 12: keyCode = KeyEvent.VK_F12; break;
}
robot.keyPress(keyCode);
robot.keyRelease(keyCode);
} catch (Exception e) {
lastException = e;
}
}
public static void tildeKey() {
try {
Robot robot = new Robot();
pressKeyCodes(robot, new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_QUOTE});
} catch (Exception e) {
lastException = e;
}
}
/* SendKeys Special Keys List
{BACKSPACE}, {BS}, or {BKSP}
{BREAK}
{CAPSLOCK}
{DELETE} or {DEL}
{DOWN}
{END}
{ENTER} or ~
{ESC}
{HELP}
{HOME}
{INSERT} or {INS}
{LEFT}
{NUMLOCK}
{PGDN}
{PGUP}
{PRTSC} (reserved for future use)
{RIGHT}
{SCROLLLOCK}
{TAB}
{UP}
{F1}
{F2}
{F3}
{F4}
{F5}
{F6}
{F7}
{F8}
{F9}
{F10}
{F11}
{F12}
{F13}
{F14}
{F15}
{F16}
{ADD}
{SUBTRACT}
{MULTIPLY}
{DIVIDE}
{{}
{}}
SHIFT +
CTRL ^
ALT %
*/
public static boolean sendKeys(String keyCommands) {
try {
Robot robot = new Robot();
boolean specialKeyFlag = false;
String specialKey = "";
boolean modifierKeyFlag = false;
String modifierKeys = "";
for (int i = 0; i < keyCommands.length(); i++) {
char key = keyCommands.charAt(i);
if (specialKeyFlag)
specialKey += key;
if (key == '{' && specialKeyFlag == false) {
specialKeyFlag = true;
specialKey = "{";
}
if (!specialKeyFlag) { //not special key(tab,enter,...) just press normal keys and modifiers
// Modifier key logic
if (key == '+' || key == '^' || key == '%') { //shift alt or ctrl
if (!modifierKeyFlag) {
modifierKeys = key + "";
modifierKeyFlag = true;
}
else
modifierKeys += key + ""; //append multiple modifiers
if (key == '+')
robot.keyPress(KeyEvent.VK_SHIFT);
if (key == '^')
robot.keyPress(KeyEvent.VK_CONTROL);
if (key == '%')
robot.keyPress(KeyEvent.VK_ALT);
continue; //skip to next key
}
pressKeyCodes(robot, getKeyCode(key));
}
if (specialKeyFlag) {
if (specialKey.equals("{ENTER}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_ENTER} );
}
else if (specialKey.equals("{ESC}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_ESCAPE} );
}
else if (specialKey.equals("{HOME}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_HOME} );
}
else if (specialKey.equals("{END}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_END} );
}
else if (specialKey.equals("{PGDN}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_PAGE_DOWN} );
}
else if (specialKey.equals("{PGUP}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_PAGE_UP} );
}
else if (specialKey.equals("{TAB}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_TAB} );
}
else if (specialKey.equals("{UP}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_UP} );
}
else if (specialKey.equals("{DOWN}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_DOWN} );
}
else if (specialKey.equals("{LEFT}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_LEFT} );
}
else if (specialKey.equals("{RIGHT}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_RIGHT} );
}
else if (specialKey.equals("{PRTSC}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_PRINTSCREEN} );
}
else if (specialKey.equals("{DELETE}") || specialKey.equals("{DEL}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_DELETE} );
}
else if (specialKey.equals("{BACKSPACE}") || specialKey.equals("{BS}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_BACK_SPACE} );
}
else if (specialKey.equals("{F1}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F1} );
}
else if (specialKey.equals("{F2}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F2} );
}
else if (specialKey.equals("{F3}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F3} );
}
else if (specialKey.equals("{F4}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F4} );
}
else if (specialKey.equals("{F5}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F5} );
}
else if (specialKey.equals("{F6}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F6} );
}
else if (specialKey.equals("{F7}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F7} );
}
else if (specialKey.equals("{F8}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F8} );
}
else if (specialKey.equals("{F9}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F9} );
}
else if (specialKey.equals("{F10}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F10} );
}
else if (specialKey.equals("{F11}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F11} );
}
else if (specialKey.equals("{F12}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F12} );
}
else if (specialKey.equals("{F13}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F13} );
}
else if (specialKey.equals("{F14}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F14} );
}
else if (specialKey.equals("{F15}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F15} );
}
else if (specialKey.equals("{F16}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_F16} );
}
else if (specialKey.equals("{PRTSC}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_PRINTSCREEN} );
}
else if (specialKey.equals("{ADD}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_ADD} );
}
else if (specialKey.equals("{SUBTRACT}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_SUBTRACT} );
}
else if (specialKey.equals("{MULTIPLY}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_MULTIPLY} );
}
else if (specialKey.equals("{DIVIDE}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_DIVIDE} );
}
else if (specialKey.equals("{PERCENT}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_5} );
}
else if (specialKey.equals("{CARROT}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_6} );
}
else if (specialKey.equals("{INSERT}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_INSERT} );
}
else if (specialKey.equals("{BREAK}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_CANCEL} );
}
else if (specialKey.equals("{BAR}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_SLASH});
}
else if (specialKey.equals("{{}")) {
specialKeyFlag = false;
pressKeyCodes(robot, new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_OPEN_BRACKET} );
}
else if (specialKey.equals("{}}")) {
specialKeyFlag = false;
pressKeyCodes(robot,new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_CLOSE_BRACKET} );
}
}
if (modifierKeyFlag) { //time to release all the modifier keys
modifierKeyFlag = false;
for (int m = 0; m < modifierKeys.length(); m++) {
char mkey = modifierKeys.charAt(m);
if (mkey == '+')
robot.keyRelease(KeyEvent.VK_SHIFT);
if (mkey == '^')
robot.keyRelease(KeyEvent.VK_CONTROL);
if (mkey == '%')
robot.keyRelease(KeyEvent.VK_ALT);
}
modifierKeys = "";
}
}
} catch (Exception e) {
lastException = e;
return false;
}
return true;
}
public static boolean pressKey(char key) {
try {
Robot robot = new Robot();
int[] keyCode = getKeyCode(key);
pressKeyCodes(robot, keyCode);
} catch (Exception e) {
lastException = e;
return false;
}
return true;
}
public static boolean keyDown(char key) {
try {
Robot robot = new Robot();
int[] keyCodes = getKeyCode(key);
for (int i = 0; i < keyCodes.length; i++) {
robot.keyPress(keyCodes[i]);
//System.out.println("pressed: " + keyCodes[i]);
}
} catch (Exception e) {
lastException = e;
return false;
}
return true;
}
public static boolean keyUp(char key) {
try {
Robot robot = new Robot();
int[] keyCodes = getKeyCode(key);
for (int i = keyCodes.length - 1; i >= 0; i--) {
robot.keyRelease(keyCodes[i]);
//System.out.println("released: " + keyCodes[i]);
}
} catch (Exception e) {
lastException = e;
return false;
}
return true;
}
public static void pressKeyCodes(Robot robot, int[] keyCodes) {
for (int i = 0; i < keyCodes.length; i++) {
robot.keyPress(keyCodes[i]);
//System.out.println("pressed: " + keyCodes[i]);
}
//robot.delay(50);
for (int i = keyCodes.length - 1; i >= 0; i--) {
robot.keyRelease(keyCodes[i]);
//System.out.println("released: " + keyCodes[i]);
}
}
public static int[] getKeyCode(char key) {
switch (key) {
case 'a': return(new int[]{KeyEvent.VK_A});
case 'b': return(new int[]{KeyEvent.VK_B});
case 'c': return(new int[]{KeyEvent.VK_C});
case 'd': return(new int[]{KeyEvent.VK_D});
case 'e': return(new int[]{KeyEvent.VK_E});
case 'f': return(new int[]{KeyEvent.VK_F});
case 'g': return(new int[]{KeyEvent.VK_G});
case 'h': return(new int[]{KeyEvent.VK_H});
case 'i': return(new int[]{KeyEvent.VK_I});
case 'j': return(new int[]{KeyEvent.VK_J});
case 'k': return(new int[]{KeyEvent.VK_K});
case 'l': return(new int[]{KeyEvent.VK_L});
case 'm': return(new int[]{KeyEvent.VK_M});
case 'n': return(new int[]{KeyEvent.VK_N});
case 'o': return(new int[]{KeyEvent.VK_O});
case 'p': return(new int[]{KeyEvent.VK_P});
case 'q': return(new int[]{KeyEvent.VK_Q});
case 'r': return(new int[]{KeyEvent.VK_R});
case 's': return(new int[]{KeyEvent.VK_S});
case 't': return(new int[]{KeyEvent.VK_T});
case 'u': return(new int[]{KeyEvent.VK_U});
case 'v': return(new int[]{KeyEvent.VK_V});
case 'w': return(new int[]{KeyEvent.VK_W});
case 'x': return(new int[]{KeyEvent.VK_X});
case 'y': return(new int[]{KeyEvent.VK_Y});
case 'z': return(new int[]{KeyEvent.VK_Z});
case 'A': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_A});
case 'B': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_B});
case 'C': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_C});
case 'D': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_D});
case 'E': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_E});
case 'F': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_F});
case 'G': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_G});
case 'H': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_H});
case 'I': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_I});
case 'J': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_J});
case 'K': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_K});
case 'L': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_L});
case 'M': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_M});
case 'N': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_N});
case 'O': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_O});
case 'P': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_P});
case 'Q': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_Q});
case 'R': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_R});
case 'S': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_S});
case 'T': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_T});
case 'U': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_U});
case 'V': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_V});
case 'W': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_W});
case 'X': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_X});
case 'Y': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_Y});
case 'Z': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_Z});
case '`': return(new int[]{KeyEvent.VK_BACK_QUOTE});
case '0': return(new int[]{KeyEvent.VK_0});
case '1': return(new int[]{KeyEvent.VK_1});
case '2': return(new int[]{KeyEvent.VK_2});
case '3': return(new int[]{KeyEvent.VK_3});
case '4': return(new int[]{KeyEvent.VK_4});
case '5': return(new int[]{KeyEvent.VK_5});
case '6': return(new int[]{KeyEvent.VK_6});
case '7': return(new int[]{KeyEvent.VK_7});
case '8': return(new int[]{KeyEvent.VK_8});
case '9': return(new int[]{KeyEvent.VK_9});
case '-': return(new int[]{KeyEvent.VK_MINUS});
case '=': return(new int[]{KeyEvent.VK_EQUALS});
case '~': return(new int[]{KeyEvent.VK_ENTER});//return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_QUOTE});
case '!': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_1});
case '@': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_2});
case '#': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_3});
case '$': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_4});
case '%': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_5});
case '^': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_6});
case '&': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_7});
case '*': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_8});
case '(': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_9});
case ')': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_0});
case '_': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_MINUS});
case '+': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_EQUALS});
case '\t': return(new int[]{KeyEvent.VK_TAB});
case '\n': return(new int[]{KeyEvent.VK_ENTER});
case '[': return(new int[]{KeyEvent.VK_OPEN_BRACKET});
case ']': return(new int[]{KeyEvent.VK_CLOSE_BRACKET});
case '\\': return(new int[]{KeyEvent.VK_BACK_SLASH});
case '{': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_OPEN_BRACKET});
case '}': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_CLOSE_BRACKET});
case '|': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_SLASH});
case ';': return(new int[]{KeyEvent.VK_SEMICOLON});
case ':': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_SEMICOLON});
case '\'': return(new int[]{KeyEvent.VK_QUOTE});
case '"': return(new int[]{KeyEvent.VK_QUOTEDBL});
case ',': return(new int[]{KeyEvent.VK_COMMA});
case '<': return(new int[]{KeyEvent.VK_LESS});
case '.': return(new int[]{KeyEvent.VK_PERIOD});
case '>': return(new int[]{KeyEvent.VK_GREATER});
case '/': return(new int[]{KeyEvent.VK_SLASH});
case '?': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_SLASH}); // needs Shift
case ' ': return(new int[]{KeyEvent.VK_SPACE});
default:
throw new IllegalArgumentException("Cannot find Key Code for character " + key);
}
}
}