当前位置: 首页 > 知识库问答 >
问题:

将字符转换为Java KeyEvent KeyCode

岳彬炳
2023-03-14

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

共有3个答案

夏飞掣
2023-03-14

更详细但更可定制

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);
            }
        }
    }
}
章高朗
2023-03-14

你可以用这个解决问题:

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);
}
公羊英达
2023-03-14

如果我有一个unicode字符,我只想知道它的击键方式,那么我使用

int keyCode = java.awt.event.KeyEvent.getExtendedKeyCodeForChar(charCode);

我从来都不需要另一种更复杂的方法

 类似资料:
  • 问题内容: 我想在GO中将字符串数组转换为字节数组,以便可以将其写到磁盘上。将字符串数组()解码为字节数组()的最佳解决方案是什么? 我正在考虑对字符串数组进行两次迭代,第一个迭代以获得字节数组所需的实际大小,然后第二个迭代写入每个元素的长度和实际字符串()。 解决方案必须能够以其他方式进行转换;从一个到一个。 问题答案: 让我们忽略一个事实,那就是走一秒钟。您需要做的第一件事是将序列化格式编组为

  • 我正在使用Schembuf在带有套接字的计算机之间更改数据。要传输数据,我使用以下内容: 然而,我注意到Protobuf无法读取任何非int类型的接收数据(它将其分配给0)。果不其然,如果我不使用套接字,但试图用相同的代码片段返回消息,则会发生相同的情况: 我还指出: 那么,为什么我不能正确地将数据转换回字符串呢?如果这是一个参考问题,为什么protobuf不能读取字符数组数据或从字符数组转换的字

  • 问题内容: 如何在Java(Android)中将字符串转换为Uri?即: myUri = ???; 问题答案: 您可以使用静态方法从

  • 问题内容: 如何将输入的生日字符串(如02 26 1991)放入公历? 我尝试首先解析它,但是它一直给我一条错误消息,所以我不太确定自己在做什么错。在此日期之前,我还有其他输入数据。一个是另一个字符串,一个是双精度值。 问题答案: 使用解析日期,然后将其分配给。 第三行可以替换为: 但我更喜欢第一个版本。

  • 问题内容: 我正在尝试将数据库中的一些值添加到Go中。其中一些是时间戳。 我得到错误: 不能在数组元素中使用U.Created_date(类型time.Time)作为类型字符串 我可以转换成吗? -- 编辑 我添加了以下内容。现在可以了,谢谢。 问题答案: 您可以使用方法将转换为。这使用格式字符串。 如果您需要其他自定义格式,则可以使用。例如,使用格式字符串获取时间戳的格式。 例: 输出(在Go

  • 注意:这个问题包含不建议使用的前1.0代码!不过,答案是正确的。 要在Rust中将转换为,我可以执行以下操作: 我知道如何将转换为的唯一方法是获取其中的一个片段,然后像这样使用: 有没有办法直接将转换为?

  • 我想将转换为,但由于某种原因无法转换。

  • 所以,基本上。我不想知道是否有可能(如果有可能,如何),实际上把一个类在C#代码中直接转换成一个字符串?因此,基本上,该类中的所有内容都进入字符串。 这有点短,但我不知道怎么说得更清楚。