简体   繁体   中英

java.awt.Robot inside games?

I'm trying to simulate a keystroke with the code below. When I open notepad it works fine but when I open the game in which I want to use it, it doesn't do anything. So keystrokes don't seem to work. I tried to simulate mouse movement and clicks, those action do work. Does anyone know how to fix this problem?

I found this question, How can I use java.awt.Robot inside games? but I can't add a comment or anything.

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);

    }

}

You probably want to press and release the keys to simulate a keystroke, ie your current code will hold down Q, W, E, R, T and Y until a release is triggered. Also, you may want to hold them down for a small amount of time, because that caused some problems for me when I did something like this.

Code :

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);
    }
}

Any time people experience problems with the java.awt.Robot methods not registering on a program, most likely it is because the methods are not releasing the key/mouse stroke or do not have a delay between press/release. This goes for mouse clicks and keystrokes alike.

There are two things to check-

  1. If you are using robot.keyPress(key) make sure to have a robot.keyRelease(key) following at some point.

  2. Make sure to have a big enough delay delay between the Press and Release . Rule of thumb 100 ms

Examples

Incorrect

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

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

Correct

robot.keyPress(key);
Thread.sleep(100) // or robot.delay(100);
robot.keyRelease(key);

As opposed above - where do you add your key listener???

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();

    }

}

and output is suprise

key pressed

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM