Eu estava mexendo com um projetinho que usa um pouco disso… na verdade o que vou colocar aqui é justamente a parte que visa tornar mais inteligível o funcionamento da classe Robot.
package robot;
import static java.awt.event.KeyEvent.VK_AMPERSAND;
import static java.awt.event.KeyEvent.VK_ASTERISK;
import static java.awt.event.KeyEvent.VK_AT;
import static java.awt.event.KeyEvent.VK_BACK_SLASH;
import static java.awt.event.KeyEvent.VK_CIRCUMFLEX;
import static java.awt.event.KeyEvent.VK_CLOSE_BRACKET;
import static java.awt.event.KeyEvent.VK_COLON;
import static java.awt.event.KeyEvent.VK_COMMA;
import static java.awt.event.KeyEvent.VK_DEAD_TILDE;
import static java.awt.event.KeyEvent.VK_DOLLAR;
import static java.awt.event.KeyEvent.VK_EQUALS;
import static java.awt.event.KeyEvent.VK_EXCLAMATION_MARK;
import static java.awt.event.KeyEvent.VK_LEFT_PARENTHESIS;
import static java.awt.event.KeyEvent.VK_MINUS;
import static java.awt.event.KeyEvent.VK_NUMBER_SIGN;
import static java.awt.event.KeyEvent.VK_OPEN_BRACKET;
import static java.awt.event.KeyEvent.VK_PERIOD;
import static java.awt.event.KeyEvent.VK_PLUS;
import static java.awt.event.KeyEvent.VK_QUOTEDBL;
import static java.awt.event.KeyEvent.VK_RIGHT_PARENTHESIS;
import static java.awt.event.KeyEvent.VK_SEMICOLON;
import static java.awt.event.KeyEvent.VK_SLASH;
import static java.awt.event.KeyEvent.VK_SPACE;
import static java.awt.event.KeyEvent.VK_UNDERSCORE;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public final class KeyMapper {
public static final Map<Character, Integer> KEYS;
static {
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (char c = 'A'; c <= 'Z'; c++) {
map.put(c, (int) c);
}
for (char c = '0'; c <= '9'; c++) {
map.put(c, (int) c);
}
for (char c = '\b'; c <= '\n'; c++) {
map.put(c, (int) c);
}
map.put(' ', VK_SPACE);
map.put(',', VK_COMMA);
map.put('.', VK_PERIOD);
map.put('!', VK_EXCLAMATION_MARK);
map.put('\', VK_BACK_SLASH);
map.put('|', VK_BACK_SLASH);
map.put(':', VK_COLON);
map.put('$', VK_DOLLAR);
map.put('_', VK_UNDERSCORE);
map.put(';', VK_SEMICOLON);
map.put(':', VK_SEMICOLON);
map.put('-', VK_MINUS);
map.put('*', VK_ASTERISK);
map.put('+', VK_PLUS);
map.put('/', VK_SLASH);
map.put('?', VK_SLASH);
map.put('=', VK_EQUALS);
map.put('@', VK_AT);
map.put('^', VK_CIRCUMFLEX);
map.put('(', VK_LEFT_PARENTHESIS);
map.put(')', VK_RIGHT_PARENTHESIS);
map.put('#', VK_NUMBER_SIGN);
map.put('[', VK_OPEN_BRACKET);
map.put(']', VK_CLOSE_BRACKET);
map.put('{', VK_OPEN_BRACKET);
map.put('}', VK_CLOSE_BRACKET);
map.put('&', VK_AMPERSAND);
map.put('
[code]
package robot;
import static java.awt.event.InputEvent.*;
import static robot.KeyMapper.*;
import static java.awt.event.KeyEvent.*;
import java.awt.Robot;
public final class RobotManager {
private Robot robot;
public RobotManager(Robot robot) throws NullPointerException {
if (robot == null) {
throw new NullPointerException();
}
this.robot = robot;
}
public void click(int x, int y) {
robot.mouseMove(x, y);
robot.mousePress(BUTTON1_MASK);
}
public void rightClick(int x, int y) {
robot.mouseMove(x, y);
robot.mousePress(BUTTON2_MASK);
}
public void type(int key) {
robot.keyPress(key);
robot.keyRelease(key);
}
public void typeSequence(int... keys) {
for (int i = 0; i < keys.length; i++) {
robot.keyPress(keys[i]);
}
for (int i = keys.length - 1; i >= 0; i--) {
robot.keyRelease(keys[i]);
}
}
public void type(String string) {
for (char c : string.toCharArray()) {
if (Character.isUpperCase(c) || mustPressShift(c)) {
robot.keyPress(VK_SHIFT);
}
Integer i = KEYS.get(Character.toUpperCase(c));
if (i == null) {
i = VK_NUMBER_SIGN;
}
type(i);
if (Character.isUpperCase(c) || mustPressShift(c)) {
robot.keyRelease(VK_SHIFT);
}
}
}
private boolean mustPressShift(char c) {
return c == '!' || c == '@' || c == '#' || c == '$' || c == '%'
|| c == '&' || c == '*' || c == '(' || c == ')' || c == '`'
|| c == '{' || c == '}' || c == '^' || c == '?' || c == ':'
|| c == '>' || c == '<' || c == '|' || c == '\"';
}
}
[/code]
E um pequeno exemplo que no Eclipse cria e executa uma classe:
[code]
package robot;
import static java.awt.event.KeyEvent.VK_A;
import static java.awt.event.KeyEvent.VK_CONTROL;
import static java.awt.event.KeyEvent.VK_DOWN;
import static java.awt.event.KeyEvent.VK_F;
import static java.awt.event.KeyEvent.VK_F11;
import static java.awt.event.KeyEvent.VK_N;
import static java.awt.event.KeyEvent.VK_S;
import static java.awt.event.KeyEvent.VK_SHIFT;
import java.awt.Robot;
public class RobotTest {
public static void main(String[] args) throws Exception {
Robot robot = new Robot();
robot.setAutoDelay(50);
robot.setAutoWaitForIdle(true);
robot.delay(1000);
RobotManager manager = new RobotManager(robot);
// Ctrl + N (New)
manager.typeSequence(VK_CONTROL, VK_N);
robot.delay(500);
// new class
manager.type("class\n\n");
robot.delay(500);
// class name: HelloRobot
manager.type("HelloRobot\n");
robot.delay(2000);
// Ctrl + A (Select all)
manager.typeSequence(VK_CONTROL, VK_A);
// type class code
manager.type("package robot;\n\npublic class HelloRobot {\n\n");
manager.type("public static void main(String[] args) {\n");
manager.type("System.out.println(\"Hello from a robot!\");");
manager.type(VK_DOWN);
manager.type('\n');
// Ctrl + Shift + F (Format)
manager.typeSequence(VK_CONTROL, VK_SHIFT, VK_F);
robot.delay(500);
// Ctrl + S (Save)
manager.typeSequence(VK_CONTROL, VK_S);
robot.delay(1000);
// Ctrl + F11 (Run)
manager.typeSequence(VK_CONTROL, VK_F11);
}
}
[/code]
Note que está bem longe de ser uma solução para todos os problemas (até porque o suporte a caracteres acentuados simplesmente não existe), mas é um começo.', VK_QUOTEDBL);
map.put('\"', VK_QUOTEDBL);
map.put('<', VK_COMMA);
map.put('>', VK_PERIOD);
map.put('&', VK_AMPERSAND);
map.put('~', VK_DEAD_TILDE);
map.put('^', VK_DEAD_TILDE);
KEYS = Collections.unmodifiableMap(map);
}
private KeyMapper() {
// can not instantiate
}
}
package robot;
import static java.awt.event.InputEvent.*;
import static robot.KeyMapper.*;
import static java.awt.event.KeyEvent.*;
import java.awt.Robot;
public final class RobotManager {
private Robot robot;
public RobotManager(Robot robot) throws NullPointerException {
if (robot == null) {
throw new NullPointerException();
}
this.robot = robot;
}
public void click(int x, int y) {
robot.mouseMove(x, y);
robot.mousePress(BUTTON1_MASK);
}
public void rightClick(int x, int y) {
robot.mouseMove(x, y);
robot.mousePress(BUTTON2_MASK);
}
public void type(int key) {
robot.keyPress(key);
robot.keyRelease(key);
}
public void typeSequence(int... keys) {
for (int i = 0; i < keys.length; i++) {
robot.keyPress(keys[i]);
}
for (int i = keys.length - 1; i >= 0; i--) {
robot.keyRelease(keys[i]);
}
}
public void type(String string) {
for (char c : string.toCharArray()) {
if (Character.isUpperCase(c) || mustPressShift(c)) {
robot.keyPress(VK_SHIFT);
}
Integer i = KEYS.get(Character.toUpperCase(c));
if (i == null) {
i = VK_NUMBER_SIGN;
}
type(i);
if (Character.isUpperCase(c) || mustPressShift(c)) {
robot.keyRelease(VK_SHIFT);
}
}
}
private boolean mustPressShift(char c) {
return c == '!' || c == '@' || c == '#' || c == '$' || c == '%'
|| c == '&' || c == '*' || c == '(' || c == ')' || c == '`'
|| c == '{' || c == '}' || c == '^' || c == '?' || c == ':'
|| c == '>' || c == '<' || c == '|' || c == '\"';
}
}
E um pequeno exemplo que no Eclipse cria e executa uma classe:
package robot;
import static java.awt.event.KeyEvent.VK_A;
import static java.awt.event.KeyEvent.VK_CONTROL;
import static java.awt.event.KeyEvent.VK_DOWN;
import static java.awt.event.KeyEvent.VK_F;
import static java.awt.event.KeyEvent.VK_F11;
import static java.awt.event.KeyEvent.VK_N;
import static java.awt.event.KeyEvent.VK_S;
import static java.awt.event.KeyEvent.VK_SHIFT;
import java.awt.Robot;
public class RobotTest {
public static void main(String[] args) throws Exception {
Robot robot = new Robot();
robot.setAutoDelay(50);
robot.setAutoWaitForIdle(true);
robot.delay(1000);
RobotManager manager = new RobotManager(robot);
// Ctrl + N (New)
manager.typeSequence(VK_CONTROL, VK_N);
robot.delay(500);
// new class
manager.type("class\n\n");
robot.delay(500);
// class name: HelloRobot
manager.type("HelloRobot\n");
robot.delay(2000);
// Ctrl + A (Select all)
manager.typeSequence(VK_CONTROL, VK_A);
// type class code
manager.type("package robot;\n\npublic class HelloRobot {\n\n");
manager.type("public static void main(String[] args) {\n");
manager.type("System.out.println(\"Hello from a robot!\");");
manager.type(VK_DOWN);
manager.type('\n');
// Ctrl + Shift + F (Format)
manager.typeSequence(VK_CONTROL, VK_SHIFT, VK_F);
robot.delay(500);
// Ctrl + S (Save)
manager.typeSequence(VK_CONTROL, VK_S);
robot.delay(1000);
// Ctrl + F11 (Run)
manager.typeSequence(VK_CONTROL, VK_F11);
}
}
Note que está bem longe de ser uma solução para todos os problemas (até porque o suporte a caracteres acentuados simplesmente não existe), mas é um começo.