我正在开发一种机器人引擎,它可以将键盘上的所有键按下/按键到记事本。即通过使用
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
类似答案 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应该包含表示实际键的值。