views:

1651

answers:

2

We have a user provided string that may contain unicode characters, and we want the robot to type that string.

How do you convert a string into keyCodes that the robot will use?
How do you do it so it is also java version independant (1.3 -> 1.6)?

What we have working for "ascii" chars is

//char c = nextChar();
//char c = 'a'; // this works, and so does 'A'
char c = 'á'; // this doesn't, and neither does 'Ă'
Robot robot = new Robot();
KeyStroke key = KeyStroke.getKeyStroke("pressed " + Character.toUpperCase(c) );
if( null != key ) {
  // should only have to worry about case with standard characters
  if (Character.isUpperCase(c))
  {
    robot.keyPress(KeyEvent.VK_SHIFT);
  }

  robot.keyPress(key.getKeyCode());
  robot.keyRelease(key.getKeyCode());

  if (Character.isUpperCase(c))
  {
    robot.keyRelease(KeyEvent.VK_SHIFT);
  }
}
+2  A: 

The KeyEvent Class does not have direct mappings for many unicode classes in JRE 1.5. If you are running this on a Windows box what you may have to do is write a custom handler that does something like this:

Robot robot = new Robot();
char curChar = 'Ã';

// -- isUnicode( char ) should be pretty easy to figure out
if ( isUnicode( curChar ) ) {
   // -- this is an example, exact key combinations will vary
   robot.keyPress( KeyEvent.VK_ALT );

   robot.keyPress( KeyEvent.VK_NUMBER_SIGN );
   robot.keyRelease( KeyEvent.VK_NUMBER_SIGN );

   // -- have to apply some logic to know what sequence
   robot.keyPress( KeyEvent.VK_0 );
   robot.keyRelease( KeyEvent.VK_0 );
   robot.keyPress( KeyEvent.VK_1 );
   robot.keyRelease( KeyEvent.VK_1 );
   robot.keyPress( KeyEvent.VK_9 );
   robot.keyRelease( KeyEvent.VK_9 );
   robot.keyPress( KeyEvent.VK_5 );
   robot.keyRelease( KeyEvent.VK_5 );

   robot.keyRelease( KeyEvent.VK_ALT );
}

e.g. Figure out what they key combinations are, and then map them to some sort of Object (maybe a HashMap?) for later lookup and execution.

Hope this helps :)

javamonkey79
Ouchie, I was hoping for simpler, but this will certainly help.
Greg Domjan
I've found that you don't need KeyEvent.VK_NUMBER_SIGN. Also that the numbers need to be entered as if by the numpad, ie. KeyEvent.VK_NUMPAD0.
Greg Domjan
Hackey goodness. I love it.
Allain Lalonde
@Greg: I figured you'd have to play with the exact configuration to get it right. Just a suggestion but you can also try converting the char to an int then to a String then a char array such that you can parse through each one ... just a thought.
javamonkey79
A: 

i think this is a bit late but...

Robot robot = new Robot();

   robot.keyPress( KeyEvent.VK_DEAD_ACUTE);

   robot.keyPress( KeyEvent.VK_A );
   robot.keyRelease( KeyEvent.VK_A );

   robot.keyRelease( KeyEvent.VK_DEAD_ACUTE );

that just type an "á"

Hector