将Char转换为Java KeyEvent KeyCode

我正在编写一个基本程序,要求用户键入一个字符串,我正在尝试使用一个Robot(来自java.awt.Robot ),它将在延迟后将此消息键入另一个文档。 我现在遇到的问题是我需要将从message.charAt(i)获得的任何内容转换为KeyEvent.VK_[insert Char] KeyCode。 有没有更好的方法来做我想做的事情? 我想我总是可以有一个巨大的switch语句来获得适当的KeyCode,但我希望有一个更优雅的方式。 我第一次想到,已经做了一段时间的python,就是创建一个字符串"KeyEvent.VK_" + message.charAt(i)并将其转换为代码以某种方式,但我认为唯一的方法是使用不鼓励的reflection。

你可以解决这个问题:

 KeyStroke ks = KeyStroke.getKeyStroke('k', 0); System.out.println(ks.getKeyCode()); 

或者只是使用这个:

 private void writeString(String s) { for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (Character.isUpperCase(c)) { robot.keyPress(KeyEvent.VK_SHIFT); } robot.keyPress(Character.toUpperCase(c)); robot.keyRelease(Character.toUpperCase(c)); if (Character.isUpperCase(c)) { robot.keyRelease(KeyEvent.VK_SHIFT); } } robot.delay(delay); } 

如果我有一个unicode角色,我想要的就是知道它的击键,那么我就用了

 int keyCode = java.awt.event.KeyEvent.getExtendedKeyCodeForChar(charCode); 

我从来没有需要另一种更复杂的方法来做到这一点。

更冗长,但更可定制

 import java.awt.AWTException; import java.awt.Robot; import java.awt.event.KeyEvent; import java.util.HashMap; import java.util.Map; public class AsciiKeyTyper { private Map strokeMap; private Robot robot; public AsciiKeyTyper() throws AWTException{ robot=new Robot(); //initialize a map from the input char to the keystroke, //using the fact that sometimes the KeyEvent key codes correspond to ASCII strokeMap=new HashMap(){ private static final long serialVersionUID = 1L;{ put('\n',new KeyStroke(KeyEvent.VK_ENTER,false)); put('\t',new KeyStroke(KeyEvent.VK_TAB,false)); put('\r',new KeyStroke(KeyEvent.VK_HOME,false)); put(' ',new KeyStroke(KeyEvent.VK_SPACE,false)); put('!',new KeyStroke(KeyEvent.VK_1,true)); put('"',new KeyStroke(KeyEvent.VK_QUOTE,true)); put('#',new KeyStroke(KeyEvent.VK_3,true)); put('$',new KeyStroke(KeyEvent.VK_4,true)); put('%',new KeyStroke(KeyEvent.VK_5,true)); put('&',new KeyStroke(KeyEvent.VK_7,true)); put('\'',new KeyStroke(KeyEvent.VK_QUOTE,false)); put('(',new KeyStroke(KeyEvent.VK_9,true)); put(')',new KeyStroke(KeyEvent.VK_0,true)); put('*',new KeyStroke(KeyEvent.VK_8,true)); put('+',new KeyStroke(KeyEvent.VK_EQUALS,true)); put(',',new KeyStroke(KeyEvent.VK_COMMA,false)); put('-',new KeyStroke(KeyEvent.VK_MINUS,false)); put('.',new KeyStroke(KeyEvent.VK_PERIOD,false)); put('/',new KeyStroke(KeyEvent.VK_SLASH,false)); for(int i=(int)'0';i<=(int)'9';i++){ put((char)i,new KeyStroke(i,false)); } put(':',new KeyStroke(KeyEvent.VK_SEMICOLON,true)); put(';',new KeyStroke(KeyEvent.VK_SEMICOLON,false)); put('<',new KeyStroke(KeyEvent.VK_COMMA,true)); put('=',new KeyStroke(KeyEvent.VK_EQUALS,false)); put('>',new KeyStroke(KeyEvent.VK_PERIOD,true)); put('?',new KeyStroke(KeyEvent.VK_SLASH,true)); put('@',new KeyStroke(KeyEvent.VK_2,true)); for(int i=(int)'A';i<=(int)'Z';i++){ put((char)i,new KeyStroke(i,true)); } put('[',new KeyStroke(KeyEvent.VK_OPEN_BRACKET,false)); put('\\',new KeyStroke(KeyEvent.VK_BACK_SLASH,false)); put(']',new KeyStroke(KeyEvent.VK_CLOSE_BRACKET,false)); put('^',new KeyStroke(KeyEvent.VK_6,true)); put('_',new KeyStroke(KeyEvent.VK_MINUS,true)); put('`',new KeyStroke(KeyEvent.VK_BACK_QUOTE,false)); for(int i=(int)'A';i<=(int)'Z';i++){ put((char)(i+((int)'a'-(int)'A')),new KeyStroke(i,false)); } put('{',new KeyStroke(KeyEvent.VK_OPEN_BRACKET,true)); put('|',new KeyStroke(KeyEvent.VK_BACK_SLASH,true)); put('}',new KeyStroke(KeyEvent.VK_CLOSE_BRACKET,true)); put('~',new KeyStroke(KeyEvent.VK_BACK_QUOTE,true)); }}; } public void typeKey(char key){ try{ strokeMap.get(key).type(); }catch(NullPointerException ex){ System.err.println("'"+key+"': no such key in mappings"); } } private class KeyStroke{ int code; boolean isShifted; public KeyStroke(int keyCode,boolean shift){ code=keyCode; isShifted=shift; } public void type(){ try{ if (isShifted) { robot.keyPress(KeyEvent.VK_SHIFT); } robot.keyPress(code); robot.keyRelease(code); if (isShifted) { robot.keyRelease(KeyEvent.VK_SHIFT); } if(code==KeyEvent.VK_ENTER){ robot.keyPress(KeyEvent.VK_HOME); robot.keyRelease(KeyEvent.VK_HOME); } }catch(IllegalArgumentException ex){ String ch=""; for(char key:strokeMap.keySet()){ if(strokeMap.get(key)==this){ ch=""+key; break; } } System.err.println("Key Code Not Recognized: '"+ch+"'->"+code); } } } } 

用reflection!

 KeyEvent.class.getField("VK_"+keyName);