2013-03-06 11 views
9

Kullanıcının String yazmasını isteyen basit bir program yazıyor ve bu iletiyi bir gecikmeden sonra başka bir belgeye yazacak bir Robot kullanmaya çalışıyorum (java.awt.Robot) . Şu anki Sorunum, message.charAt(i)'dan aldığım her şeyi KeyEvent.VK_[insert Char] KeyCode'a dönüştürmem gerektiğidir. Yapmaya çalıştığım şeyi yapmanın daha iyi bir yolu var mı? Ben her zaman uygun KeyCode alır büyük bir anahtar deyimi olabilir ama herhalde daha zarif bir şekilde olacağını umuyordum varsayalım. İlk düşüncem, bir süredir python yapmış olmak, "KeyEvent.VK_" + message.charAt(i) dizgisini yapmak ve bunu bir şekilde kodla dönüştürmek oldu, ama bunu yapmanın tek yolunun cesaret kırıcı olan Yansıma'yı kullanmak olduğunu düşünüyorum.Bir Char'ı Java'ya Dönüştürme KeyEvent KeyCode

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

ya da sadece bunu kullanın:

+0

Ah, işte bu o zaman daha basit olmalıdır. Sahip olacağınız daha büyük sorun, farklı klavye düzenlerinin "genişletilmiş" tuş vuruşlarını (shift + ... 'gibi) içermesi için hangi tuş kombinasyonlarının gerektiğini değiştirmesidir. Diğer problem ise, "A" ve "a" nın aynı sanal anahtar olması, birbirinden gelenlerin 'Shift' anahtarının eklenmesidir. Karşı karşıya kaldığınız problemler hakkında bir fikir sahibi olmak için [this] 'a bakın (http://stackoverflow.com/questions/14572270/how-can-i-perfectly-simulate-keyevents/14615814#14615814). – MadProgrammer

cevap

10

bu belgeyle halledebiliriz

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' nerededir? – Ryan

+0

Üzgünüm Cahracter sınıfı için bir sarıcı kullandım ve tutulmanın orada kullanmak istediği "thougt" olmalı: D Onu düzelttim. – Wolfii

+0

KeyStroke yolu, getKeyStroke (Character, int) 'yerine getKeyStroke (int, int)' yi çağırıyor gibi görünüyor. –

11

Bir unicode karakter var ve tüm istediğim, sonra bunun için tuş bilmek ise bunu yapmak için başka, daha karmaşık bir şekilde hiç gerek olmadı

int keyCode = KeyEvent.getExtendedKeyCodeForChar(charCode); 

kullanın.

+2

'a bağladığımda bu işleve sahip olmadığım bir "8" olur. Java'nın hangi sürümü üzerindesiniz? – phreakhead

+0

Bu Java7 ... ancak tüm olası değerleri çalıştırmak ve örneğin önceki sürümlerde kullanabileceğiniz bir MAP özelliği oluşturmak için kolayca kullanabilirsiniz. –

+1

@phreakhead, doğru KeyEvent sınıfını aldığınızdan emin olun. Sen java.awt.event.KeyEvent' istiyorsun. Bu yöntemi ilk denediğimde IDE, Java ile paketlenmiş bir tane daha aldı! – Jason

-3

Yansıma kullanın!

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

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

1

Çok daha fazla ayrıntılı ama daha özelleştirilebilir

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