8

您如何从字母字符中获取 VK 代码?似乎您应该能够执行类似的操作javax.swing.KeyStroke.getKeyStroke('c').getKeyCode(),但这不起作用(结果为零)。如果您已经有了 KeyEvent,每个人都知道如何获取密钥代码,但是如果您只想将 chars 转换为 VK int 怎么办?我对获取奇怪字符的 FK 代码不感兴趣,只有 [AZ]、[az]、[0-9]。

这个问题的背景--------我见过的所有机器人教程都假设程序员喜欢通过发送带有VK代码的按键来拼写单词:

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

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

4

8 回答 8

6
AWTKeyStroke.getAWTKeyStroke('c').getKeyCode();

稍微澄清佩斯的回答。它应该是单引号(代表一个字符),而不是双引号(代表一个字符串)。

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

于 2010-11-05T20:40:41.247 回答
5

也许这个丑陋的黑客:

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 代码的映射。

于 2009-03-20T07:43:25.713 回答
4
AWTKeyStroke.getAWTKeyStroke("C").getKeyCode();
于 2010-10-22T21:41:28.943 回答
2

我在为扩展 Robot 而编写的类中将以下代码用于大写字母和数字:


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_whatever值并进行了适当的数学运算以在我的代码中进行补偿。

于 2011-06-29T16:44:35.730 回答
1

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

首先意识到 java 有两个字节字符,而不是近 2^16 KeyEvent.VK_ 的定义。所以会有一些字符不能生成任何 KeyEvent 来获得该输出。

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

于 2009-03-20T05:11:51.477 回答
1

Adam Paynter 的答案(对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;
    // ...
    }
}

请参阅整个清单(包括周围的实用程序类)的原始答案。

于 2011-04-29T10:45:27.813 回答
1

如果您的主要目标是尽可能快地写出字母,您可以像我所做的那样将字符串写入剪贴板,然后只需使用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 循环一次将每个字母放在剪贴板上,并在它们之间插入一个。

于 2015-01-25T06:29:06.567 回答
0

我找到了两种方法:

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

于 2011-10-09T14:58:34.110 回答