java - 使用 Java Robot 模拟按键类型

标签 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]]

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

最佳答案

这有点棘手和令人困惑,你很困惑。

没有“大写 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() Returns the character associated with the key in this event. For example, the KEY_TYPED event for shift + "a" returns the value for "A"

因此,当您尝试使用“A”时,您会返回 VK_A 并且事情会按您的预期进行。但是当您简单地输入“a”时,您会得到 0x61,这不是您想要的。

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

也就是说我不会去搞乱 KEY_PRESS/KEY_RELEASED。我只需从那里拦截 KEY_TYPED 和“Robot”即可。

关于java - 使用 Java Robot 模拟按键类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8546048/

相关文章:

java - header 签名无效;在 excel 文档上使用 Apache POI 的 IOException

java - Java 中的数据建模

c# - windows phone 8.1 swype 键盘事件捕获

JAVA 无法从另一个类中绘制到 JFrame 上

java - 如何将 BufferedImage 转换/转换为图像?

ios - 快速更改键盘大小事件?

c# - 在 C# 中处理 KeyDown 和 KeyPress 事件

java - 使用 intellij 和 jprofiler 分析 junit 测试

java - 支持 JAR 的 Java 插件框架

java - 如何在浏览器关闭时触发小程序中的 windowClosing() 事件