java.awt.Robot внутри игр?

Я пытаюсь смоделировать нажатие клавиши с помощью приведенного ниже кода. Когда я открываю блокнот, он работает нормально, но когда я открываю игру, в которой я хочу его использовать, он ничего не делает. Таким образом, нажатия клавиш не работают. Я пытался имитировать движение мыши и щелчки, эти действия действительно работают. Кто-нибудь знает, как решить эту проблему?

Я нашел этот вопрос: Как я могу использовать java.awt.Robot внутри игр? но я не могу добавить комментарий или что-то еще.

package MyProject;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class KeyStroke {

    public static void main(String[] args) throws AWTException {

        Robot robot = new Robot();

        robot.delay(3000);

        robot.keyPress(KeyEvent.VK_Q);
        robot.keyPress(KeyEvent.VK_W);
        robot.keyPress(KeyEvent.VK_E);
        robot.keyPress(KeyEvent.VK_R);
        robot.keyPress(KeyEvent.VK_T);
        robot.keyPress(KeyEvent.VK_Y);

    }

}

person PHPeter    schedule 18.09.2014    source источник
comment
Вы можете показать, как вы пытались имитировать нажатие клавиши?   -  person Martin Frank    schedule 18.09.2014
comment
awt.Robot требуется видимый контейнер верхнего уровня   -  person mKorbel    schedule 18.09.2014
comment
взгляните на это: stackoverflow.com/questions/5282588/   -  person Hussain Akhtar Wahid 'Ghouri'    schedule 18.09.2014
comment
@HussainAkhtarWahid'Ghouri' Это совсем другой язык...   -  person bcsb1001    schedule 09.09.2015


Ответы (3)


Вероятно, вы захотите нажать и отпустить клавиши, чтобы имитировать нажатие клавиши, т. е. ваш текущий код будет удерживать Q, W, E, R, T и Y до тех пор, пока не сработает отпускание. Кроме того, вы можете захотеть удерживать их в течение небольшого промежутка времени, потому что это вызвало у меня некоторые проблемы, когда я делал что-то подобное.

Код:

package MyProject;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class KeyStroke {
    private static Robot robot;

    public static void main(String[] args) throws AWTException {
        robot = new Robot();
        robot.delay(3000);
        keystroke(KeyEvent.VK_Q);
        keystroke(KeyEvent.VK_W);
        keystroke(KeyEvent.VK_E);
        keystroke(KeyEvent.VK_R);
        keystroke(KeyEvent.VK_T);
        keystroke(KeyEvent.VK_Y);
    }

    private static void keystroke(int key) {
        robot.keyPress(key);
        robot.delay(100); // hold for a tenth of a second, adjustable
        robot.keyRelease(key);
    }
}
person bcsb1001    schedule 18.09.2014
comment
Ой, извините, этот код - это просто то, что я пробовал, также пробовал KeyPress/Release, но это не имело значения. Ваш второй комментарий о удерживании его нажатым некоторое время решил мою проблему. Большое Вам спасибо!! - person PHPeter; 18.09.2014
comment
@PHPeter Вы можете принять мой ответ, если он решил вашу проблему, щелкнув контур галочки. - person bcsb1001; 18.09.2014

Каждый раз, когда у людей возникают проблемы с методами java.awt.Robot, которые не регистрируются в программе, скорее всего, это происходит из-за того, что методы не отпускают клавишу/нажатие мыши или не имеют задержки между нажатием/отпусканием. Это касается как щелчков мышью, так и нажатий клавиш.

Есть две вещи, чтобы проверить-

  1. Если вы используете robot.keyPress(key), убедитесь, что в какой-то момент у вас есть robot.keyRelease(key).

  2. Убедитесь, что между Press и Release имеется достаточно большая задержка задержки. Эмпирическое правило 100 ms

Примеры

Неправильно

robot.keyPress(key); // without a keyRelease

robot.keyPress(key); 
robot.keyRelease(key); // no delay

Правильный

robot.keyPress(key);
Thread.sleep(100) // or robot.delay(100);
robot.keyRelease(key);
person Zach    schedule 27.08.2018

В отличие от вышеизложенного - где вы добавляете своего ключевого слушателя???

public class BetaTest {

    public static void main (String[] args){
        new BetaTest().startUp();
    }


    private void startUp() {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

        final KeyAdapter ka = new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                System.out.println("key pressed");
            }

        };

        frame.addKeyListener(ka);

        Runnable r = new Runnable() {

            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    KeyEvent ke = new KeyEvent(frame, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, KeyEvent.VK_A, 'a');
                    ka.keyPressed(ke);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        Thread t = new Thread(r);
        t.setDaemon(true);
        t.start();

    }

}

и результат сюрприз

key pressed
person Martin Frank    schedule 18.09.2014
comment
ОП не хочет ничего делать с прослушиванием или свингом - просто java.awt.Robot. - person bcsb1001; 18.09.2014
comment
ну... вы можете подумать, что я ошибаюсь, но первое предложение: я пытаюсь смоделировать нажатие клавиши с помощью приведенного ниже кода. и позже Кто-нибудь знает, как решить эту проблему ... я не вижу, как это неправильно относилось к вопросу ... даже когда я просил разъяснений, ответа не было дано ... - person Martin Frank; 18.09.2014
comment
Не знаю, как вам, но мне кажется совершенно очевидным, что имитация нажатия клавиши — это не то же самое, что прослушивание нажатия клавиши. Кроме того, код специально показал попытку использовать java.awt.Robot, что совершенно не связано с вашим «решением». Кроме того, я явно прав, потому что у меня есть принятый ответ. Так что да, я думаю, что вы ошибаетесь. - person bcsb1001; 18.09.2014
comment
хорошо читаем cr.openjdk.java.net/~alanb/6854954/webrev.00/src/share/classes/ наверняка ЗНАЕТ, что java.awt.robot использует KeyEvents для < b>моделирование ключевых событий... так что, допустим, вы правы..... - person Martin Frank; 18.09.2014