2011-12-17 54 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和“机器人”。