2011-12-17 55 views
2

我寫了一個方法,從KeyEvent的模擬按鍵,如下圖所示:模擬按鍵式的Java機器人

private Robot robot(){ 
     if(robot==null){ 
      try { 
       return new Robot(); 
      } catch (AWTException e) { 
       throw new RuntimeException("Failed to create instance of Robot"); 
      } 
     }else{ 
      return robot; 
     } 
    } 

public void sendKeyEvent(KeyEvent evt) throws IOException { 
     int type = evt.getID(); 
     if(type == KeyEvent.KEY_PRESSED){ 
      if(evt.isShiftDown()){ 
       robot().keyPress(KeyEvent.VK_SHIFT); 
      } 
      robot().keyPress(evt.getKeyChar()); 
     }else if(type == KeyEvent.KEY_RELEASED){ 
      robot().keyRelease(evt.getKeyChar()); 
      if(evt.isShiftDown()){ 
       robot().keyRelease(KeyEvent.VK_SHIFT); 
      } 
     } 
    } 

此方法時收到按「A」鍵時,它可以輸入「A」。

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='A',modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_UNKNOWN]] 

但問題是,當它接收到該KeyEvent的(按 'A')時,它按下acturaly 「1」。

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='a',keyLocation=KEY_LOCATION_UNKNOWN]] 

有人能告訴我這種方法有什麼問題嗎?

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2011-12-17 16:23:55

+0

@AndrewThompson,謝謝你的建議。 – eric2323223 2011-12-17 16:34:54

回答

4

這有點棘手和混亂,你感到困惑。

沒有'大寫的a'和'小寫的a'鍵事件。只有'A/a'事件,你可以有或沒有SHIFT修飾符。

它恰好是VK_A到VK_Z通過'Z'與ASCII'A'相同但'a'到'z'不相同。

當你重新發送「A」(ASCII 0x61,又名97),你從getKeyChar(),你實際上是發送了正在VK_NUMPAD1,這就是爲什麼你得到了「1」了。

getKeyChar的JavaDoc中這樣說:

getKeyChar()返回與此事件 的鍵相對應的字符。例如,對於移KEY_TYPED事件+「一」返回「A」

所以,當你用「A」試試,你回來VK_A的 價值和工作的事情,你期望的那樣。但是當你簡單地鍵入'a'時,你會得到0x61,這不是你想要的。

至於我可以告訴改變getKeyChar()getKeyCode()將解決您的問題。

這就是說我不會去搞亂KEY_PRESS/KEY_RELEASED。我只是從那裏攔截KEY_TYPED和「機器人」。