Вопрос

Как вы получаете код 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)".

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top