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