有没有办法从Java中的Keyboard获取所有键?

时间:2015-04-17 11:03:01

标签: java unicode awt awtrobot

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

现在,如果我将键盘布局更改为意大利,如果我输入/按方形BracketLeft& BracketRight应打印或输入è& amp; *, 分别。这些是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(机器人)执行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

类似

2 个答案:

答案 0 :(得分:2)

这个问题相当棘手。 Java机器人的问题在于它是一个与本机底层工具包一起使用的实现,它期望的输入类型从实现变为实现。

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

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

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

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

对于位于美国版面上; 的意大利语ò,请发送密钥代码VK_SEMICOLON

这在我的Mac和我的Linux Mint上对我有用。但问题是:只有当我的主要英语键盘变体是“英语(美国)”而不是“英语(德沃夏克)”时,它才能在我的Linux上运行。这就是为什么我警告你不同平台上的不同实现。

由于我没有在Windows上测试过,我不知道这是否有效。但是你试一试:在运行机器人之前切换手动布局,并让它发送适用于英语/美国键盘的密钥代码。

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

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

答案 1 :(得分:1)

通过反射,您应该能够获得所有常量。这是一个未经测试的例子:

Field[] fields = KeyEvent.class.getDeclaredFields();
for (Field field : fields) {
    if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers)) {
        int keyValue = field.getInt(null);
    }
}

现在,keyValue应该包含表示实际键的值。