Имитация типа ключа с помощью Java Robot - PullRequest
2 голосов
/ 17 декабря 2011

Я пишу метод для имитации нажатия клавиш из KeyEvent, как показано ниже:

private Robot robot(){
        if(robot==null){
            try {
                return new Robot();
            } catch (AWTException e) {
                throw new RuntimeException("Failed to create instance of Robot");
            }
        }else{
            return robot;
        }
    }

public void sendKeyEvent(KeyEvent evt) throws IOException {
        int type = evt.getID();
        if(type == KeyEvent.KEY_PRESSED){
            if(evt.isShiftDown()){
                robot().keyPress(KeyEvent.VK_SHIFT);
            }
            robot().keyPress(evt.getKeyChar());
        }else if(type == KeyEvent.KEY_RELEASED){
            robot().keyRelease(evt.getKeyChar());
            if(evt.isShiftDown()){
                robot().keyRelease(KeyEvent.VK_SHIFT);
            }
        }
    }

Когда этот метод получил нажатие клавиши «А», он может набрать «А».

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='A',modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_UNKNOWN]]

Но проблема в том, что когда он получил KeyEvent (нажмите «a»), он фактически нажал «1».

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='a',keyLocation=KEY_LOCATION_UNKNOWN]]

Может кто-нибудь сказать мне, что не так с этим методом?

1 Ответ

4 голосов
/ 17 декабря 2011

Это немного сложно и запутанно, и вы запутались.

Нет ключевых событий в верхнем и нижнем регистре. Есть только события «A / a», и вы можете иметь или не иметь модификатор SHIFT.

Просто так получилось, что VK_A-VK_Z идентичны ASCII от 'A' до 'Z', но не так, что от 'a' до 'z'.

Когда вы повторно отправляете 'a' (ASCII 0x61, aka 97), который вы получили от getKeyChar () , вы фактически отправляете VK_NUMPAD1, поэтому вы получаете '1 ».

JavaDoc для getKeyChar говорит следующее:

getKeyChar () Возвращает символ, связанный с ключом в этом событие. Например, событие KEY_TYPED для shift + "a" возвращает значение для "A"

Так что, когда вы пытаетесь с 'A', вы получаете VK_A, и все работает, как вы ожидаете. Но когда вы просто набираете «а», вы получаете 0x61, а это не то, что вам нужно.

Насколько я могу судить, изменение getKeyChar () на getKeyCode () решит вашу проблему.

Это сказало, что я не буду баловаться с KEY_PRESS / KEY_RELEASED. Я бы просто перехватил KEY_TYPED и "Robot" оттуда.

...