【问题标题】:Simulate key type with Java Robot使用 Java Robot 模拟键类型
【发布时间】:2012-01-22 16:20:53
【问题描述】:

我写了一个方法来模拟 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]]

谁能告诉我这个方法有什么问题?

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • @AndrewThompson,感谢您的建议。

标签: java awt keyboard-events awtrobot


【解决方案1】:

这有点棘手和令人困惑,您会感到困惑。

没有“大写 a”和“小写 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 和“机器人”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2017-07-15
    • 2013-06-30
    • 2011-07-24
    相关资源
    最近更新 更多