How to make the Java.awt.Robot type unicode characters? (Is it possible?)
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);
}
}
Based on javamonkey79's code I've created the following snippet which should work for all Unicode values...
public static void pressUnicode(Robot r, int key_code)
{
r.keyPress(KeyEvent.VK_ALT);
for(int i = 3; i >= 0; --i)
{
// extracts a single decade of the key-code and adds
// an offset to get the required VK_NUMPAD key-code
int numpad_kc = key_code / (int) (Math.pow(10, i)) % 10 + KeyEvent.VK_NUMPAD0;
r.keyPress(numpad_kc);
r.keyRelease(numpad_kc);
}
r.keyRelease(KeyEvent.VK_ALT);
}
This automatically goes through each decade of the unicode key-code, maps it to the corresponding VK_NUMPAD equivalent and presses/releases the keys accordingly.
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 :)