代码之家  ›  专栏  ›  技术社区  ›  Myer

从Java中的任意字符获取VK int

  •  8
  • Myer  · 技术社区  · 15 年前

    如何从字母字符中获取VK代码?看来你应该能做点什么 javax.swing.KeyStroke.getKeyStroke('c').getKeyCode() 但那不起作用(结果是零)。如果你已经有了keyEvent,每个人都知道如何获取密钥代码,但是如果你只想把chars转换成vk ints呢?我对获取奇怪字符的FK代码不感兴趣,只有[A-Z]、[A-Z]、[0-9]。

    此问题的上下文----- 我看过的所有机器人教程都假设程序员喜欢通过发送带有VK代码的按键来拼写单词:

    int keyInput[] = {
          KeyEvent.VK_D,
          KeyEvent.VK_O,
          KeyEvent.VK_N,
          KeyEvent.VK_E
      };//end keyInput array
    

    称我懒惰,但即使有了Eclipse,也无法在GUI上使用TDD。如果有人碰巧知道一个类似机器人的类,它接受字符串,然后为这些字符串模拟用户输入(我正在使用 FEST )我很想知道。

    8 回复  |  直到 15 年前
        1
  •  5
  •   fulkod    15 年前

    也许这个丑陋的黑客:

    Map<String, Integer> keyTextToCode = new HashMap<String, Integer>(256);
    Field[] fields = KeyEvent.class.getDeclaredFields();
    for (Field field : fields) {
        String name = field.getName();
        if (name.startsWith("VK_")) {
            keyTextToCode.put(name.substring("VK_".length()).toUpperCase(),
                              field.getInt(null));
        }
    }
    

    然后,keytextTocode将包含从字符串(例如“a”或“page-up”)到VK代码的映射。

        2
  •  6
  •   Community Paul Sweatte    7 年前
    AWTKeyStroke.getAWTKeyStroke('c').getKeyCode();
    

    稍微澄清 Pace's answer . 它应该是单引号(表示字符),而不是双引号(表示字符串)。

    使用双引号将引发java.lang.IllegalArgumentException(字符串格式不正确)。

        3
  •  4
  •   Pace    14 年前
    AWTKeyStroke.getAWTKeyStroke("C").getKeyCode();
    
        4
  •  2
  •   bananaman42    13 年前

    在我编写的扩展机器人类中,我对大写字母和数字使用以下代码:

    
    public void typeLetterOrNumber(char c) {
        if(Character.isLetter(c)) {
            keyPress((int)c);
            keyRelease((int)c);
        }
        else if(Character.isDigit(c)) {
            keyPress(48+(int)c);
            keyRelease(48+(int)c);
        }
    }
    

    基本上,我只是看看 keyevent.vk_随便什么 并在我的代码中进行了适当的数学补偿。

        5
  •  1
  •   Clint    15 年前

    我不认为有一个简单的答案。

    首先意识到Java有两个字节字符,而不是将近2 ^ 16键事件。所以会有一些字符,不能为它们生成keyEvent来获取输出。

    此外,C和C以及和都有相同的 KeyEvent.getKeyCode() == KeyEvent.VK_C .

        6
  •  1
  •   Community Paul Sweatte    7 年前

    亚当·帕因特的回答(对问题的回答) Convert String to KeyEvents )也应该在这里工作。简单但有效的想法是有一个像下面这样的大开关:

    public void type(char character) {
        switch (character) {
        case 'a': doType(VK_A); break;
        case 'b': doType(VK_B); break;
        case 'c': doType(VK_C); break;
        case 'd': doType(VK_D); break;
        case 'e': doType(VK_E); break;
        // ...
        case 'A': doType(VK_SHIFT, VK_A); break;
        case 'B': doType(VK_SHIFT, VK_B); break;
        case 'C': doType(VK_SHIFT, VK_C); break;
        // ...
        }
    }
    

    整个列表(包括周围的实用程序类)见原始答案。

        7
  •  1
  •   starwarswii Georgi Peev    8 年前

    如果您的主要目标是尽可能快地写出字母,那么您可以做我所做的,即将字符串写入剪贴板,然后使用 Robot 类以输入ctrl+v。

    static void type(String s) {
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(s), null);
        robot.setAutoDelay(30);
        robot.keyPress(VK_CONTROL);
        robot.keyPress(VK_V);
        robot.keyRelease(VK_CONTROL);
        robot.keyRelease(VK_V);
    }
    

    系统剪贴板中还有一些其他功能,允许您保存和恢复剪贴板上的任何数据,以备需要。此外,如果要控制每个字符之间的速度,可以将每个字母一次一个放到剪贴板上,并使用 robot.delay(n); 在它们之间,使用foreach循环。

        8
  •  0
  •   Jarekczek    13 年前

    我发现有两种方法:

    a.使用jbutton.setmnemonic和getmnemonic的解决方法:

    javax.swing.JButton but = new javax.swing.JButton();
    but.setMnemonic(charVkValue);
    int intVkValue = but.getMnemonic());
    

    b.下载打开的JDK源代码并查看其abstractButton.setmnemonic(char)方法。此代码是根据GPL2授权的,但这4行通常与“keypress(48+(int)c)”的答案相同。

    http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/swing/javax/swing/AbstractButton.java.htm