Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,有没有一种方法可以从键盘获取所有键?_Java_Unicode_Awt_Awtrobot - Fatal编程技术网

在Java中,有没有一种方法可以从键盘获取所有键?

在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

我在一个机器人引擎上工作,它将把键盘上的所有按键按到一个记事本上。i、 利用
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
如果在可编辑字段中有焦点,并且机器人按下并释放特定的键代码,您应该会看到字母
è

对于意大利ò,位于;在美国布局上,发送keycode
VKò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.
常量的键值,以及如何用java
Robot
创建这些键值。感谢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获得了所有的按键事件。我实现了按键侦听器。它从键盘捕获所有按键事件