Метод ввода Java для виртуальной клавиатуры - PullRequest
0 голосов
/ 08 марта 2010

Я столкнулся с проблемой при реализации метода ввода для виртуальной клавиатуры. В настоящее время я использую класс робота для отправки ввода в любое приложение с виртуальной клавиатуры. Но для этого мне нужно создать сопоставление кода клавиши и юникода, которое не согласуется на разных раскладках клавиатуры. Могу ли я напрямую передать UNICODE в любое приложение, используя метод ввода, не беспокоясь о сопоставлении кода клавиши и юникода.

Будет полезна любая полезная ссылка или пример кода.

Это простая программа на Java, которая всегда поверх любого приложения и работает как экранная клавиатура. Используя мышь при нажатии любой кнопки (клавиши) на клавиатуре, соответствующий символ будет набран в приложении, запущенном ниже. Это отлично работает для английских алфавитов. Я сталкиваюсь с проблемой, пока я работаю для Unicode.


найдите фрагмент кода ниже

   public static void simulateKeyEvent(char key){
    try{
            AWTKeyStroke awtKS = AWTKeyStroke.getAWTKeyStroke(key);
            int key_code = awtKS.getKeyCode();
            System.out.println("key = "+key+" keyCode = "+key_code);
            robot.keyPress(key_code);
            robot.keyRelease(key_code);

    }catch(Exception e){
            e.printStackTrace();
    }
}

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Как мне это удалось:

//on startup: override the SystemEventQueue
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
final OwnEventQueue newEventQueue = new OwnEventQueue();
eventQueue.push(newEventQueue);
//because dispatchEvent is protected
public class OwnEventQueue {
    private final static OwnEventQueue instance;

    static{
        instance = new OwnEventQueue();
    }

    @Override
    public void dispatchEvent(AWTEvent event) {
        super.dispatchEvent(event);
    }

    public static OwnEventQueue getInstance() {
        return instance;
    }
}
//then onpress of keyboard button
Character character = getCharacter();
int[] events = {KeyEvent.KEY_PRESSED, KeyEvent.KEY_RELEASED, KeyEvent.KEY_TYPED};
for (int i = 0; i < events.length; i++) {
    KeyEvent pressKeyEvent = new KeyEvent(focusComponent, events[i], System.currentTimeMillis(), 0, 0, character.charValue());
    OwnEventQueue.getInstance().dispatchEvent(pressKeyEvent);
}
robotKeystrokeSender.keyPress(KeyEvent.VK_RIGHT);
robotKeystrokeSender.delay(10);
robotKeystrokeSender.keyRelease(KeyEvent.VK_RIGHT);
0 голосов
/ 08 марта 2010

Ваша виртуальная клавиатура используется в качестве устройства вашей ОС? Или, другими словами, вы пытались считать ее «настоящей» клавиатурой? Согласно аппаратной абстракции Java, если бы вашу виртуальную клавиатуру считали драйвером, она должна просто работать как настоящая клавиатура.

РЕДАКТИРОВАТЬ : согласно комментарию, это не виртуальное устройство, а приложение Java, как следствие, проблема в другом.

Согласно Javadoc, робот может отправлять нажатий клавиш, заданных как int . Чтобы создать эти нажатия клавиш из символов, я бы порекомендовал вам создать их, используя <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/KeyStroke.html#getKeyStroke(char)" rel="nofollow noreferrer">getKeystroke(char)</a>, а затем преобразовать их в целочисленные значения, используя <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/AWTKeyStroke.html#getKeyCode()" rel="nofollow noreferrer">getKeycode()</a>. Таким образом, у вас будут целочисленные значения, связанные с вашими юникод-символами, какими бы они ни были.

РЕДАКТИРОВАТЬ 2 : еще раз, модификация; -)

похоже, что <a href="http://java.sun.com/j2se/1.3/docs/api/javax/swing/KeyStroke.html#getKeyStroke(java.lang.String)" rel="nofollow noreferrer">getKeyStroke(String)</a> "должен" обрабатывать символы Юникода.

...