在Java中,有没有一种方法可以从键盘获取所有键?
我在一个机器人引擎上工作,它将把键盘上的所有按键按到一个记事本上。i、 利用在Java中,有没有一种方法可以从键盘获取所有键?,java,unicode,awt,awtrobot,Java,Unicode,Awt,Awtrobot,我在一个机器人引擎上工作,它将把键盘上的所有按键按到一个记事本上。i、 利用 robot.keyPress(KeyEvent.VK_A); robot.keyrease(KeyEvent.VK_A); 如此类推,因为KeyEvent(ascii)中存在这种可能性 现在,如果我改变键盘布局,比如说意大利,如果我键入/按下方括号left和方括号right,它应该分别打印或键入è和*。这些是unicode字符,没有帮助。根据KeyEvent的API,它支持ASCII。因此无法调用Unicode Ke
robot.keyPress(KeyEvent.VK_A);
robot.keyrease(KeyEvent.VK_A);
如此类推,因为KeyEvent(ascii)中存在这种可能性
现在,如果我改变键盘布局,比如说意大利,如果我键入/按下方括号left和方括号right,它应该分别打印或键入è和*。这些是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(),但这也是徒劳的。这是我根据中给出的建议尝试的
1) 现在我在想,是否可以用java从键盘上读取键作为行和列&我可以开始使用它了?是的,我怎么做?哪个API
或
2) 是否有其他方法可以使用Java(Robot)为Unicode字符执行按键事件
或
3) 任何其他媒体都可以从按键输入记事本,以实现不同的键盘布局
所有这些我都在Java1.6和Java1.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
char[]c={'è'、'+'、'*'、'ù'、'§'、'ò'、'ç'、'a'、'''、':'、'-'、''u'};
执行中风(c)`
私有void performKeyStroke(字符[]字符){
int charLeng=null==chars?0:chars.length;
对于(int t=0;t,通过反射,您应该能够获得所有常量。这是一个未经测试的示例:
Field[] fields = KeyEvent.class.getDeclaredFields();
for (Field field : fields) {
if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers)) {
int keyValue = field.getInt(null);
}
}
现在,keyValue应该包含表示实际键的值。这个问题相当棘手。Java robot的问题是,它是一个与本机底层工具包一起工作的实现,并且它所期望的输入类型随着实现的不同而变化
在我的机器(Mac和LinuxMint)上稍微测试一下,Java机器人似乎需要US布局的键码,并发送正确的字符,前提是您的键盘布局在运行时设置为正确的语言
也就是说,如果在意大利布局中,è键是[键在美国布局中的位置,那么您应该:
- 将布局切换为意大利语
- 告诉机器人发送
VK\u OPEN\u支架
keycode
如果在可编辑字段中有焦点,并且机器人按下并释放特定的键代码,您应该会看到字母è
对于意大利ò,位于;在美国布局上,发送keycodeVKòu分号
这在我的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);
这不是OP要问的。他要问的是根本没有VK.
常量的键值,以及如何用javaRobot
创建这些键值。感谢Ractoc&Real怀疑论者,实际上它给出了所有字段,但不符合键盘布局。另外,如果Robot.keyPress用于键值,我想它可能没有Unicode字符的e代码..将试用。正如Real疑论者所说,我正在尝试使用robot Engine键入Unicode字符谢谢,Real疑论者。我在Windows笔记本电脑上以编程方式为这3个按键进行了尝试。选择记事本布局为Italy…`this.typeLableName(KeyEvent.VK_OPEN_括号);this.keyPressRelease(KeyEvent.VK_OPEN_括号);OPEN括号'this.typeLableName(KeyEvent.VK_CLOSE_括号);this.shiftKeyPress(KeyEvent.VK_CLOSE_括号);CLOSE括号^this.typeLableName(KeyEvent.VK_分号);this.shiftKeyPress(KeyEvent.VK_分号)“分号”。但当我手动为开括号、闭括号和分号@Kiran添加注释时,很抱歉,注释并不适用于代码,我无法理解您编写的内容。也许您可以将此添加为问题的编辑,然后在此处给我留下一条注释,说明如何查看?同时解释keyPress是什么Release
和typeLabelName
。抱歉@realpoint,ok将在多个注释中共享代码片段,其中keyPressRelease和typeLabelName是以下通用方法:`protected void typeLabelName(int keyCode){String labelName=KeyEvent.getKeyText(keyCode);;type(labelName+“”);}`另一种方法:
protectedvoidkeypressrelease(intkeycode){try{this.robot.keyPress(keyCode);this.robot.keyprelease(keyCode);}catch(ava.lang.IllegalArgumentException e){logger.error(“键入错误”,e);}{code>protectedvoidshiftkeypress(intkeycode){this.robot.keyPress(KeyEvent.VK_SHIFT);keyPressRelease(keyCode)this.robot.keyprelease(KeyEvent.VK_SHIFT);}我没有使用robot。但是我用java获得了所有的按键事件。我实现了按键侦听器。它从键盘捕获所有按键事件