2013-03-06 3 views
9

私は、文字列を入力するようにユーザーに求めている、遅れてこのメッセージを他の文書に戻すロボット(java.awt.Robot)を使用しようとしています。 。私が今問題にしたのは、私が得たものをmessage.charAt(i)からKeyEvent.VK_[insert Char] KeyCodeに変換する必要があることです。私がやろうとしていることをする良い方法がありますか?私はいつもちょうど適切なKeyCodeを取得する大規模なswitch文を持つことができると思うが、私はよりエレガントな方法があることを望んでいた。しばらくの間、Pythonをやっていた私の最初の考えは、文字列を"KeyEvent.VK_" + message.charAt(i)に変換してコードに変換することでしたが、これを行う唯一の方法はReflectionを使用することです。文字をJava KeyEventに変換するKeyCode

+0

ああ、これはそれがその後、単純にする必要があります。より大きな問題は、異なるキーボードレイアウトが、「拡張」キーストローク(「shift + ...」など)を含めるために必要なキーの組み合わせを変更することです。もう1つの問題は、 "A"と "a"が同じ仮想キーであることです。それらを互いに打ち消すのは、 "Shift"キーの追加です。あなたが直面する問題のいくつかのアイデアについては、[this](http://stackoverflow.com/questions/14572270/how-can-i-perfectly-simulate-keyevents/14615814#14615814)をご覧ください。 – MadProgrammer

答えて

10

あなたはこれで何かを仕事ができる:それから、私はUnicode文字を持っていると私が望むすべてはそれのためのキーストロークを知っているのであれば

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

'Characterrobot'はどこから来ましたか? – Ryan

+0

ああ、申し訳ありません、私はCahracterクラスのラッパーを使用しており、eclipseは "thougt"を持っていなければなりません。 – Wolfii

+0

KeyStrokeの方法は、 'getKeyStroke(Character、int)'ではなく 'getKeyStroke(int、int)'を呼び出すようです。 –

11

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

か、単にこれを使用します私は使用する

int keyCode = KeyEvent.getExtendedKeyCodeForChar(charCode); 

私はこれを行うために別のより複雑な方法を必要としたことはありません。

+2

私はその機能を持っていません。どのJavaのバージョンを使用していますか? – phreakhead

+0

これはJava7ですが、これを使用してすべての可能な値を実行し、たとえば以前のバージョンで使用できるProperties MAPを簡単に作成できます。 –

+1

@phreakheadでは、正しいKeyEventクラスをインポートするようにしてください。 'java.awt.event.KeyEvent'が必要です。私が最初にこのメソッドを試したとき、私のIDEはJavaでパッケージ化された別のものをピックアップしました! – Jason

-3

反射を使用してください!

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

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

1

より多くの冗長が、よりカスタマイズ

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); 
      } 
     } 
    } 
} 
関連する問題