2013-03-06 13 views
9

Ich schreibe ein Basisprogramm, das den Benutzer auffordert, einen String einzugeben, und ich versuche, einen Roboter (von java.awt.Robot) zu verwenden, der diese Nachricht nach einer Verzögerung in ein anderes Dokument zurückgibt . Das Problem, das ich jetzt habe, ist, dass ich konvertieren muss, was auch immer ich von message.charAt(i) zu einem KeyEvent.VK_[insert Char] KeyCode bekomme. Gibt es einen besseren Weg, um das zu tun, was ich versuche? Ich nehme an, ich könnte immer nur eine massive Switch-Anweisung haben, die den richtigen KeyCode bekommt, aber ich hatte gehofft, dass es einen eleganteren Weg geben würde. Mein erster Gedanke, nachdem ich eine Weile Python gemacht hatte, bestand darin, eine Zeichenkette "KeyEvent.VK_" + message.charAt(i) zu erstellen und diese irgendwie in Code umzuwandeln, aber ich denke, der einzige Weg, dies zu tun, ist die Verwendung von Reflection, von der abgeraten wird.Konvertieren eines Zeichenzeichens in Java KeyEvent KeyCode

+0

Ah, sollte dies einfacher sein, dann ist es. Das größere Problem, das Sie haben werden, ist, dass verschiedene Tastaturlayouts ändern, welche Kombination von Schlüsseln erforderlich ist, um "erweiterte" Schlüsselstriche (wie "shift + ...") einzuschließen. Das andere Problem ist, dass ein "A" und ein "a" derselbe virtuelle Schlüssel sind, was sie voneinander abstößt, ist das Hinzufügen der "Shift" -Taste. Werfen Sie einen Blick auf [this] (http://stackoverflow.com/questions/14572270/how-can-i-perfectly-simulate-keyevents/14615814#14615814) für eine Vorstellung von den Problemen, denen Sie gegenüberstehen. – MadProgrammer

Antwort

10

Sie könnten etwas aus mit dieser Arbeit:

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

oder einfach nur benutzen:

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); 
} 
+0

Woher kommt 'Characterrobot'? – Ryan

+0

Oh, tut mir leid, ich habe einen Wrapper für die Cahracter-Klasse benutzt und die Eclipse muss "Thougt" haben, ich will sie dort benutzen: D Ich habe sie korrigiert. – Wolfii

+0

Der KeyStroke-Weg scheint "getKeyStroke (int, int)" statt "getKeyStroke (Character, int)" aufzurufen. –

11

Wenn ich ein Unicode-Zeichen und alles, was ich will, ist die Tasten für sie zu wissen, dann Ich benutze

int keyCode = KeyEvent.getExtendedKeyCodeForChar(charCode); 

Ich habe nie eine andere, kompliziertere Art und Weise, dies zu tun benötigt.

+2

Ich habe diese Funktion nicht. In welcher Version von Java sind Sie? – phreakhead

+0

Es ist Java7 ... aber Sie können es einfach verwenden, um alle möglichen Werte zu durchlaufen und zum Beispiel eine Eigenschaften-MAP zu erstellen, die Sie in früheren Versionen verwenden konnten. –

+1

@phreakhead, stellen Sie sicher, dass Sie die richtige KeyEvent-Klasse importieren. Sie möchten 'java.awt.event.KeyEvent'. Als ich diese Methode zum ersten Mal ausprobiert habe, hat meine IDE eine andere mit Java gepackt! – Jason

-3

Reflexion verwenden!

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

(int) KeyEvent.class.getField ("VK _" + Schlüsselname) .getInt (null); –

1

Viel ausführlicher aber anpassbarer

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<Character,KeyStroke> 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<Character,KeyStroke>(){ 
       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); 
      } 
     } 
    } 
}