Получить VK int из произвольного символа в java

Как получить код ВК из символа, который является буквой? Вроде бы можно сделать что-то вроде javax.swing.KeyStroke.getKeyStroke('c').getKeyCode(), но это не работает (результат нулевой). Все знают, как получить код ключа, если у вас уже есть KeyEvent, но что делать, если вы просто хотите превратить chars в int ВК? Меня не интересует получение кода 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 в графическом интерфейсе. Если кто-нибудь знает о роботоподобном классе, который принимает строки, а затем имитирует пользовательский ввод для этих строк (я использую FEST), хотелось бы узнать.


person Myer    schedule 20.03.2009    source источник


Ответы (7)


Может быть, этот уродливый взлом:

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.

person fulkod    schedule 20.03.2009

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

Небольшое уточнение ответа Пейса. Это должны быть одинарные кавычки (представляющие символ), а не двойные кавычки (представляющие строку).

Использование двойных кавычек вызовет исключение java.lang.IllegalArgumentException (неверный формат строки).

person pR0Ps    schedule 05.11.2010

Я использую следующий код для прописных букв и цифр в классе, который я написал для расширения 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);
    }
}

По сути, я просто просмотрел значения KeyEvent.VK_whatever и сделал соответствующие математические расчеты, чтобы компенсировать это в своем коде.

person bananaman42    schedule 29.06.2011

Я не думаю, что на это есть простой ответ.

Сначала поймите, что java имеет два байтовых символа, а не около 2 ^ 16 KeyEvent.VK_ определено. Таким образом, будут символы, для которых нельзя сгенерировать KeyEvent, чтобы получить этот вывод.

Кроме того, C и c, Ç и ç имеют одинаковые KeyEvent.getKeyCode() == KeyEvent.VK_C.

person Clint    schedule 20.03.2009

Ответ Адама Пейнтера (ответ на вопрос Преобразовать строку в 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;
    // ...
    }
}

См. исходный ответ для всего списка (включая окружающий служебный класс).

person Touko    schedule 29.04.2011

Если ваша основная цель — выводить буквы как можно быстрее, вы можете сделать то же, что и я: записать строку в буфер обмена, а затем просто использовать класс 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.

person Starwarswii    schedule 25.01.2015

Я нашел 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

person Jarekczek    schedule 09.10.2011