Получить VK int от произвольного символа в Java - PullRequest
8 голосов
/ 20 марта 2009

Как вы получаете код ВКонтакте от буквы, которая является буквой? Кажется, что вы должны быть в состоянии сделать что-то вроде javax.swing.KeyStroke.getKeyStroke('c').getKeyCode(), но это не работает (результат равен нулю). Все знают, как получить код ключа, если у вас уже есть KeyEvent, но что, если вы просто хотите превратить символы в целые числа ВКонтакте? Я не заинтересован в получении кода FK для странных символов, только [A-Z], [a-z], [0-9].

Контекст этой проблемы -------- Все учебные пособия по роботам, которые я видел, предполагают, что программисты любят писать слова, отправляя нажатия клавиш с кодами ВКонтакте:

int keyInput[] = {
      KeyEvent.VK_D,
      KeyEvent.VK_O,
      KeyEvent.VK_N,
      KeyEvent.VK_E
  };//end keyInput array

Называйте меня ленивым, но даже с Eclipse это не способ использовать TDD в графических интерфейсах. Если кто-нибудь узнает о классе, подобном роботу, который принимает строки, а затем моделирует пользовательский ввод для этих строк (я использую FEST ), я бы хотел знать.

Ответы [ 8 ]

6 голосов
/ 05 ноября 2010
AWTKeyStroke.getAWTKeyStroke('c').getKeyCode();

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

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

5 голосов
/ 20 марта 2009

Может быть, этот уродливый хак:

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.

4 голосов
/ 23 октября 2010
AWTKeyStroke.getAWTKeyStroke("C").getKeyCode();
2 голосов
/ 29 июня 2011

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

1 голос
/ 25 января 2015

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

1 голос
/ 29 апреля 2011

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

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

1 голос
/ 20 марта 2009

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

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

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

0 голосов
/ 09 октября 2011

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

...