使用Java Robot模拟密钥类型

时间:2011-12-17 16:16:28

标签: java awt keyboard-events awtrobot

我写了一个方法来模拟来自KeyEvent的按键,如下所示:

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')时,它会按下“1”。

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

有人能告诉我这种方法有什么问题吗?

1 个答案:

答案 0 :(得分:4)

这有点棘手和混乱,你感到困惑。

没有'大写a'和'小写''关键事件。只有'A / a'事件,您可以拥有或不拥有SHIFT修饰符。

恰好是VK_A到VK_Z与ASCII“A”到“Z”相同,但对于“a”到“z”则不然。

当你重新发送你从 getKeyChar()获得的'a'(ASCII 0x61,又名97)时,你实际上是在发送VK_NUMPAD1,这就是为什么你会得到' 1' 。

getKeyChar 的JavaDoc说明了这一点:

  

getKeyChar()返回与此关键字相关联的字符   事件。例如,shift +“a”的KEY_TYPED事件返回   “A”的值

因此,当您尝试使用'A'时,您会回到VK_A并且事情按预期工作。但是当你只输入“a”时,你得到的是0x61,这不是你想要的。

据我所知,将 getKeyChar()更改为 getKeyCode()可以解决您的问题。

那就是说我不会搞乱KEY_PRESS / KEY_RELEASED。我只是从那里拦截KEY_TYPED和“机器人”。