你如何从一个字符是一个字母的VK码?好像你应该能够做到像javax.swing.KeyStroke.getKeyStroke('c').getKeyCode(),但不工作(结果是零)。每个人都知道如何获得关键代码,如果你已经有了一个KeyEvent的,但如果你只是想转成字符VK整数什么?我不感兴趣,在得到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 ),我很想知道。

有帮助吗?

解决方案

也许这丑陋的黑客攻击:

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码。

其他提示

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

,稍向澄清 Pace的答案的。它应该是单引号(表示字符),而不是双引号(表示字符串)。

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

AWTKeyStroke.getAWTKeyStroke("C").getKeyCode();

我使用大写字母和数字的一类以下代码我写延长机器人:


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 的值,并做了适当的数学在我的代码来进行补偿。

我不认为这是一个简单的答案此。

首先认识到的java具有两个字节字符,几乎没有2 ^ 16 KeyEvent.VK_的定义。因此,有将要为可产生没有KeyEvent的来获取输出字符。

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

亚当佩恩特的答案(回答的问题字符串转换为的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;
    // ...
    }
}

请参阅整个列表的原始应答(包括周围的工具类)。

如果你的主要目标是尽可能快地写出来的文字,你可以做我所做的这是写一个字符串复制到剪贴板,然后只用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循环。

有2种方式,我发现:

一个。使用JButton.setMnemonic,getMnemonic的一种解决方法:

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

B中。下载JDK开放源码,看看它的AbstractButton.setMnemonic(焦炭)方法。此代码GPL2的许可,但这些4行一般做相同的答案“按键(48+(INT)c)中。”

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top