我正在开发一个机器人引擎,它将键盘上存在的所有键按下/按键到记事本。即通过使用
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/