2013-03-06 20 views
9

Sto scrivendo un programma di base che chiede all'utente di digitare una stringa e sto cercando di utilizzare un robot (da java.awt.Robot) che riporterà questo messaggio in un altro documento dopo un ritardo . Il problema che ho ora è che ho bisogno di convertire qualunque cosa ottenga da message.charAt(i) a un KeyCode KeyEvent.VK_[insert Char]. C'è un modo migliore per fare ciò che sto cercando di fare? Suppongo che potrei sempre avere un'enorme istruzione switch che ottiene il KeyCode appropriato ma speravo che ci fosse un modo più elegante. Il mio primo pensiero, avendo fatto python per un po 'di tempo, era di creare una stringa "KeyEvent.VK_" + message.charAt(i) e convertirla in codice in qualche modo, ma penso che l'unico modo per farlo sia usare Reflection che è scoraggiato.Conversione di un Char in Java KeyEvent KeyCode

+0

Ah, questo dovrebbe essere più semplice, allora è. Il problema più grande che si avrà è che layout di tastiera diversi cambieranno quale combinazione di tasti è richiesta per includere i tratti chiave "estesi" (come 'shift + ...'). L'altro problema è che "A" e "a" sono la stessa chiave virtuale, ciò che li disginstush l'uno dall'altro è l'aggiunta della chiave 'Shift'. Dai un'occhiata a [questo] (http://stackoverflow.com/questions/14572270/how-can-i-perfectly-simulate-keyevents/14615814#14615814) per avere un'idea dei problemi che stai per affrontare. – MadProgrammer

risposta

10

Si potrebbe lavorare su qualcosa con questo:

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

o semplicemente utilizzare questo:

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

Da dove viene il 'Characterrobot'? – Ryan

+0

Oh scusa ho usato un wrapper per la classe Cahracter ed eclipse deve avere "thougt" voglio usarlo lì: D l'ho corretto. – Wolfii

+0

Sembra che il modo KeyStroke invochi 'getKeyStroke (int, int)' piuttosto che 'getKeyStroke (Character, int)'. –

11

Se ho un carattere Unicode e tutto quello che voglio è quello di conoscere la sequenza di tasti per esso, allora Io uso

int keyCode = KeyEvent.getExtendedKeyCodeForChar(charCode); 

Non ho mai avuto bisogno di un altro, più complicato modo di farlo.

+2

Non ho questa funzione. Su quale versione di Java sei? – phreakhead

+0

È Java7 ... ma è possibile utilizzarlo facilmente per eseguire tutti i possibili valori e creare, ad esempio, una MAP proprietà che è possibile utilizzare nelle versioni precedenti. –

+1

@phreakhead, assicurati di importare la classe KeyEvent corretta. Vuoi 'java.awt.event.KeyEvent'. Quando ho provato questo metodo per la prima volta, il mio IDE ne ha preso un altro con Java! – Jason

-3

Utilizzare la riflessione!

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

(int) KeyEvent.class.getField ("VK _" + keyName) .getInt (null); –

1

Molto più prolisso, ma più personalizzabile

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