将字符转换为Java KeyEvent KeyCode

将字符转换为Java KeyEvent KeyCode,java,key,Java,Key,我正在编写一个要求用户键入字符串的基本程序,我正在尝试使用Robot(来自java.awt.Robot)在延迟后将此消息键入另一个文档。我现在遇到的问题是,我需要将从message.charAt(I)中获得的任何内容转换为KeyEvent.VK\u[insert Char]KeyCode。有没有更好的方法来做我想做的事情?我想我总是可以有一个巨大的switch语句来获得适当的键码,但我希望有一种更优雅的方式。我做了一段时间python之后的第一个想法是制作一个字符串“KeyEvent.VK_”+

我正在编写一个要求用户键入字符串的基本程序,我正在尝试使用Robot(来自
java.awt.Robot
)在延迟后将此消息键入另一个文档。我现在遇到的问题是,我需要将从
message.charAt(I)
中获得的任何内容转换为
KeyEvent.VK\u[insert Char]
KeyCode。有没有更好的方法来做我想做的事情?我想我总是可以有一个巨大的switch语句来获得适当的键码,但我希望有一种更优雅的方式。我做了一段时间python之后的第一个想法是制作一个字符串
“KeyEvent.VK_”+message.charAt(i)
,并以某种方式将其转换为代码,但我认为唯一的方法是使用反射,这是不鼓励的

你可以用这个解决问题:

KeyStroke ks = KeyStroke.getKeyStroke('k', 0);
System.out.println(ks.getKeyCode());
或者用这个:

private void writeString(String s) {
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (Character.isUpperCase(c)) {
            robot.keyPress(KeyEvent.VK_SHIFT);
        }
        robot.keyPress(Character.toUpperCase(c));
        robot.keyRelease(Character.toUpperCase(c));

        if (Character.isUpperCase(c)) {
            robot.keyRelease(KeyEvent.VK_SHIFT);
        }
    }
    robot.delay(delay);
}
private void writeString(字符串s){
对于(int i=0;i
如果我有一个unicode字符,我只想知道它的击键方式,那么我就使用

int keyCode = java.awt.event.KeyEvent.getExtendedKeyCodeForChar(charCode);
我从来都不需要另一种更复杂的方法来实现这一点。

使用反射

KeyEvent.class.getField("VK_"+keyName);

更详细但更可定制

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;

public class AsciiKeyTyper {

    private Map<Character,KeyStroke> strokeMap;
    private Robot robot;
    public AsciiKeyTyper() throws AWTException{
        robot=new Robot();
        //initialize a map from the input char to the keystroke,
        //using the fact that sometimes the KeyEvent key codes correspond to ASCII
        strokeMap=new HashMap<Character,KeyStroke>(){
                private static final long serialVersionUID = 1L;{
            put('\n',new KeyStroke(KeyEvent.VK_ENTER,false));
            put('\t',new KeyStroke(KeyEvent.VK_TAB,false));
            put('\r',new KeyStroke(KeyEvent.VK_HOME,false));
            put(' ',new KeyStroke(KeyEvent.VK_SPACE,false));
            put('!',new KeyStroke(KeyEvent.VK_1,true));
            put('"',new KeyStroke(KeyEvent.VK_QUOTE,true));
            put('#',new KeyStroke(KeyEvent.VK_3,true));
            put('$',new KeyStroke(KeyEvent.VK_4,true));
            put('%',new KeyStroke(KeyEvent.VK_5,true));
            put('&',new KeyStroke(KeyEvent.VK_7,true));
            put('\'',new KeyStroke(KeyEvent.VK_QUOTE,false));
            put('(',new KeyStroke(KeyEvent.VK_9,true));
            put(')',new KeyStroke(KeyEvent.VK_0,true));
            put('*',new KeyStroke(KeyEvent.VK_8,true));
            put('+',new KeyStroke(KeyEvent.VK_EQUALS,true));
            put(',',new KeyStroke(KeyEvent.VK_COMMA,false));
            put('-',new KeyStroke(KeyEvent.VK_MINUS,false));
            put('.',new KeyStroke(KeyEvent.VK_PERIOD,false));
            put('/',new KeyStroke(KeyEvent.VK_SLASH,false));
            for(int i=(int)'0';i<=(int)'9';i++){
                put((char)i,new KeyStroke(i,false));
            }
            put(':',new KeyStroke(KeyEvent.VK_SEMICOLON,true));
            put(';',new KeyStroke(KeyEvent.VK_SEMICOLON,false));
            put('<',new KeyStroke(KeyEvent.VK_COMMA,true));
            put('=',new KeyStroke(KeyEvent.VK_EQUALS,false));
            put('>',new KeyStroke(KeyEvent.VK_PERIOD,true));
            put('?',new KeyStroke(KeyEvent.VK_SLASH,true));
            put('@',new KeyStroke(KeyEvent.VK_2,true));
            for(int i=(int)'A';i<=(int)'Z';i++){
                put((char)i,new KeyStroke(i,true));
            }
            put('[',new KeyStroke(KeyEvent.VK_OPEN_BRACKET,false));
            put('\\',new KeyStroke(KeyEvent.VK_BACK_SLASH,false));
            put(']',new KeyStroke(KeyEvent.VK_CLOSE_BRACKET,false));
            put('^',new KeyStroke(KeyEvent.VK_6,true));
            put('_',new KeyStroke(KeyEvent.VK_MINUS,true));
            put('`',new KeyStroke(KeyEvent.VK_BACK_QUOTE,false));
            for(int i=(int)'A';i<=(int)'Z';i++){
                put((char)(i+((int)'a'-(int)'A')),new KeyStroke(i,false));
            }
            put('{',new KeyStroke(KeyEvent.VK_OPEN_BRACKET,true));
            put('|',new KeyStroke(KeyEvent.VK_BACK_SLASH,true));
            put('}',new KeyStroke(KeyEvent.VK_CLOSE_BRACKET,true));
            put('~',new KeyStroke(KeyEvent.VK_BACK_QUOTE,true));
        }};
    }
    public void typeKey(char key){
        try{
            strokeMap.get(key).type();
        }catch(NullPointerException ex){
            System.err.println("'"+key+"': no such key in mappings");
        }
    }
    private class KeyStroke{
        int code;
        boolean isShifted;
        public KeyStroke(int keyCode,boolean shift){
            code=keyCode;
            isShifted=shift;
        }
        public void type(){
            try{
                if (isShifted) {
                    robot.keyPress(KeyEvent.VK_SHIFT);
                }
                robot.keyPress(code);
                robot.keyRelease(code);
                if (isShifted) {
                    robot.keyRelease(KeyEvent.VK_SHIFT);
                }
                if(code==KeyEvent.VK_ENTER){
                    robot.keyPress(KeyEvent.VK_HOME);
                    robot.keyRelease(KeyEvent.VK_HOME);
                }

            }catch(IllegalArgumentException ex){
                String ch="";
                for(char key:strokeMap.keySet()){
                    if(strokeMap.get(key)==this){
                        ch=""+key;
                        break;
                    }
                }
                System.err.println("Key Code Not Recognized: '"+ch+"'->"+code);
            }
        }
    }
}
import java.awt.AWTException;
导入java.awt.Robot;
导入java.awt.event.KeyEvent;
导入java.util.HashMap;
导入java.util.Map;
公共类ascikeytyper{
私人地图;
私人机器人;
public ascikeytyper()引发AWTException{
机器人=新机器人();
//初始化从输入字符到击键的映射,
//使用KeyEvent键代码有时对应于ASCII的事实
strokeMap=newhashmap(){
私有静态最终长serialVersionUID=1L{
put('\n',新击键(KeyEvent.VK_ENTER,false));
put('\t',新击键(KeyEvent.VK_选项卡,false));
put('\r',新击键(KeyEvent.VK_HOME,false));
put(“”,新击键(KeyEvent.VK_空格,false));
put(“!”,新的击键(KeyEvent.VK_1,true));
put(“”,新的击键(KeyEvent.VK_QUOTE,true));
put(“#”,新的击键(KeyEvent.VK_3,true));
put(“$”,新击键(KeyEvent.VK_4,true));
put(“%”,新击键(KeyEvent.VK_5,true));
put('&',新击键(KeyEvent.VK_7,true));
put('\'',新击键(KeyEvent.VK_QUOTE,false));
put('(',新击键(KeyEvent.VK_9,true));
put('),新的击键(KeyEvent.VK_0,true));
put('*',新击键(KeyEvent.VK_8,true));
put(+',新击键(KeyEvent.VK_EQUALS,true));
put(',',新击键(KeyEvent.VK_逗号,false));
put('-',新的击键(KeyEvent.VK_减号,false));
put('.',新击键(KeyEvent.VK_PERIOD,false));
put('/',新的击键(KeyEvent.VK_斜杠,false));

对于(int i=(int)'0';iAh,这应该比它更简单。您将遇到的更大的问题是,不同的键盘布局将改变需要包含“扩展”按键笔划的按键组合(如
shift+…
)。另一个问题是,“a”和“a”“是同一个虚拟键,它们之间的区别在于添加了
Shift
键。看看您将要面临的问题的一些想法。
Characterrobot
从何而来?哦,对不起,我使用了Cahracter类的包装器,eclipse必须有“thougt”我想在那里使用它:D我更正了它。击键方式似乎是调用
getKeyStroke(int,int)
,而不是
getKeyStroke(Character,int)
。肯定还有更多,因为这个方法对我不起作用。我的“h”变成了“8”当我将生成的密钥代码插入Robot.keyPress时,我没有该功能。您使用的是什么版本的Java?它是Java7…但您可以轻松地使用它运行所有可能的值,并创建,例如,可以在以前版本中使用的属性映射。@phreakhead,请确保导入正确的KeyEvent类。您可以想要
java.awt.event.KeyEvent
。当我第一次尝试这个方法时,我的IDE选择了另一个用java打包的方法!冒号
有一个问题:
robot.keyPress(KeyEvent.getExtendedKeyCodeForChar(text.charAt(I)))
这一行抛出
IllegalArgumentException
当字符出现在将搜索它的人的
中时,它也不适用于“@”。这是因为在键盘上没有像
@
;(int)KeyEvent.class.getField(“VK+keyName).getInt(null)这样的键,而它是(可能是)这是最短、最聪明的解决方案,一般不建议在这种情况下使用反射。