Получаем VK int из произвольного символа в java
-
21-08-2019 - |
Вопрос
Как вы получаете код 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 это не способ использовать TDD в графических интерфейсах.Если кто-нибудь случайно знает о роботоподобном классе, который принимает строки, а затем имитирует пользовательский ввод для этих строк (я использую ПРАЗДНИК), я хотел бы знать.
Решение
Может быть, этот уродливый взлом:
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();
Небольшое уточнение Ответ Пейса.Это должны быть одинарные кавычки (представляющие символ), а не двойные кавычки (представляющие строку).
Использование двойных кавычек приведет к возникновению java.lang.Исключение IllegalArgumentException (строка отформатирована неправильно).
AWTKeyStroke.getAWTKeyStroke("C").getKeyCode();
Я использую следующий код для прописных букв и цифр в классе, который я написал для расширения 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);
}
}
В принципе, я просто посмотрел на Ключевое событие.VK_whatever значения и выполнил соответствующую математику для компенсации в моем коде.
Я не думаю, что на этот вопрос есть простой ответ.
Сначала поймите, что java имеет два байтовых символа и почти не содержит ключевого события 2 ^ 16.VK_ определен.Таким образом, будут существовать символы, для которых никакое ключевое событие не может быть сгенерировано, чтобы получить этот результат.
Кроме того, C и c, а также Ç и ç все имеют одинаковый KeyEvent.getKeyCode() == KeyEvent.VK_C
.
Ответ Адама Пейнтера (ответил на вопрос Преобразовать строку в ключевые события) также должен работать здесь.Простая, но работающая идея состоит в том, чтобы иметь большой переключатель, подобный следующему:
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 способа, которые я нашел:
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)".