Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java中的任意字符获取VK int_Java_Unit Testing_Keyboard_Awtrobot_Fest - Fatal编程技术网

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

从java中的任意字符获取VK int,java,unit-testing,keyboard,awtrobot,fest,Java,Unit Testing,Keyboard,Awtrobot,Fest,如何从字母字符中获取VK代码?看起来您应该能够执行类似于javax.swing.KeyStroke.getKeyStroke('c').getKeyCode()的操作,但这不起作用(结果为零)。如果您已经有一个KeyEvent,那么每个人都知道如何获取密钥代码,但是如果您只是想将char转换为VK int呢?我对奇怪字符的FK代码不感兴趣,只有[A-Z]、[A-Z]、[0-9] 这一问题的背景-------- 我看过的所有机器人教程都假设程序员喜欢通过发送带有VK代码的按键来拼写单词: 可以说我

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

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


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

我认为没有一个简单的答案

首先要意识到java有两个字节的字符,而不是定义了几乎2^16 KeyEvent.VK_。所以会有一些字符,不能为它们生成KeyEvent来获得输出

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

也许这是一个丑陋的黑客:

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));
    }
}
Map keyTextToCode=newhashmap(256);
Field[]fields=KeyEvent.class.getDeclaredFields();
用于(字段:字段){
字符串名称=field.getName();
if(name.startsWith(“VK_”)){
keyTextToCode.put(name.substring(“VK_u).length()).toUpperCase(),
field.getInt(null));
}
}
keyTextToCode随后将包含从字符串(例如“A”或“PAGE_UP”)到vk代码的映射

AWTKeyStroke.getAWTKeyStroke("C").getKeyCode();
稍微澄清一下。它应该是单引号(表示字符),而不是双引号(表示字符串)


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

Adam Paynter的答案(对问题的回答)也应该在这里起作用。简单但可行的想法是有一个大开关,如下所示:

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而编写的类中使用以下大写字母和数字代码:


公共无效类型LetterOrNumber(字符c){
if(字符(c)){
按键((int)c);
按键释放((int)c);
}
else if(字符isDigit(c)){
按键(48+(int)c);
按键释放(48+(int)c);
}
}

基本上,我只是查看了KeyEvent.VK_的值,并在代码中进行了适当的数学补偿。

我找到了两种方法:

A.使用JButton.setMnemonic和getMnemonic的变通方法:

javax.swing.JButton but = new javax.swing.JButton();
but.setMnemonic(charVkValue);
int intVkValue = but.getMnemonic());
下载开放jdk源代码并查看其AbstractButton.setMnemonic(char)方法。这段代码是在GPL2下授权的,但这4行代码通常与“keyPress(48+(int)c)”的答案相同


如果您的主要目标是尽快写出字母,您可以像我一样将字符串写入剪贴板,然后使用
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循环

javax.swing.JButton but = new javax.swing.JButton();
but.setMnemonic(charVkValue);
int intVkValue = but.getMnemonic());
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);
}