java - 有没有办法从 Java 中的键盘获取所有键?

标签 java unicode awt awtrobot

我正在开发一个机器人引擎,它将键盘上存在的所有键按下/按键到记事本。即通过使用 robot.keyPress(KeyEvent.VK_A); robot.keyRelease(KeyEvent.VK_A); 以此类推,因为 KeyEvent 中存在这种可能性,它是 ascii。

现在,如果我将键盘布局更改为 Italy,如果我键入/按下方形 BracketLeft 和 BracketRight,它应该分别打印或键入 è 和 *。这些是 unicode 字符,它没有帮助。根据 KeyEvent 的 API,它支持 ASCII。所以无法调用Unicode。

KeyStroke ks = KeyStroke.getKeyStroke(chars[t], 0); 
//Where chars is the array storing unicode characters
 System.out.println(ks.getKeyCode());

上面一个尝试使用 ALT+ks.getKeyCode(),但这也是徒劳的。这是我按照 here stackoverflow 中给出的建议尝试的

1) 现在我在想是否可以在 Java 中读取键盘上的键的行和列,然后我可以开始播放/使用它?是的,我该怎么做?哪个 API?

或者 2) 有没有其他方法可以使用 Java (Robot) 为 Unicode 字符执行 keyPress 事件?

或者 3) 从 keyPress 到不同键盘布局的记事本中的任何其他媒体。

我正在 Java 1.6 和 Java 1.8 上尝试所有这些。

期待您的宝贵建议。

 char []c =  {'è','é','+','*','ù','§','ò','ç','à','°','.',':','-','_'};
 performKeyStroke(c);`

 private void performKeyStroke(char []chars){

    int charLeng = null == chars ?0:chars.length;

                for(int t=0;t<charLeng;t++){



                    System.out.println("trying for --->"+chars[t]);
                    KeyStroke ks = KeyStroke.getKeyStroke(chars[t], 0);
                     System.out.println(ks.getKeyCode());
                                                pressCombinationKeys(String.valueOf(ks.getKeyCode()));

}//End of for loop


}//End of performKeyStroke

private void pressCombinationKeys(String nums){
    this.robot.keyPress( KeyEvent.VK_ALT );

     // -- have to apply some logic to know what sequence
    this.keyPressRelease( KeyEvent.VK_0 );


    int numLength = null == nums?0:nums.length();
    try{
        for(int u=0;u<numLength;u++){
            this.keyPressRelease(Integer.valueOf(nums.charAt(u)));
            System.out.print(nums.charAt(u));
        }//End of for loop
    }catch(Exception e){
        e.printStackTrace();
    }
    this.robot.keyRelease( KeyEvent.VK_ALT );
}//End of pressCombinationKeys

提前致谢 这是我问过的类似问题 here

最佳答案

这个问题比较棘手。 Java 机器人的问题在于它是一个与本地底层工具包一起工作的实现,并且它期望的输入类型会随着实现的不同而变化。

在我的机器(一台 Mac 和一台 Linux Mint)上稍微测试一下,Java 机器人似乎需要美式布局的键码,并发送正确的字符 ,前提是您的键盘布局设置为运行时的正确语言

也就是说,如果在意大利布局中,è 键位于美国布局中 [ 键的位置,那么您应该:

  • 将布局切换为意大利语
  • 告诉机器人发送VK_OPEN_BRACKET键码

如果焦点位于可编辑字段中,并且机器人按下并释放该特定键码,您应该会看到字母 è

对于位于美国布局上 ; 的意大利语 ò,发送键码 VK_SEMICOLON

这适用于我的 Mac 和 Linux Mint。但这就是问题所在:仅当我的主要英文键盘变体是“English(US)”而不是“English(Dvorak)”时,它才能在我的 Linux 上运行。这就是为什么我警告您不同平台上的不同实现。

因为我没有在 Windows 上测试过,所以我不能说这是否有效。但您可以尝试一下:在运行机器人之前手动切换布局,并让它发送适合英语/美国键盘的键码。

顺便说一下,只能使用主要布局上的键码!也就是说,如果你想发送意大利语 ç,你应该发送四个键盘事件:

robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_SEMICOLON);
robot.keyRelease(KeyEvent.VK_SEMICOLON);
robot.keyRelease(KeyEvent.VK_SHIFT);

关于java - 有没有办法从 Java 中的键盘获取所有键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29697411/

相关文章:

java - 在 IntelliJ 上运行测试时无法加载 messages.properties

java - 在 Java 中,如何处理 Unicode 字符和 Java UTF-16 代码点?

c++ - 在尊重 BOM 的同时匹配 Unicode 代码点的约定?

java - mouseDragged() 事件后未调用 mouseReleased() ?

java - 如何用java模拟真实的鼠标点击?

java - 如何从 Protobuf 生成 Scala 文件而不是 Java 文件

java - 有没有标准的方法来重定向 SOAP 请求?

java - Mockito 空指针异常

unicode - 当使用不区分大小写的标志时,为什么正则表达式 "[a-z]"与非 ASCII 字符 "İıſK"匹配?

Java AWT - 最后添加的按钮未显示