簡體   English   中英

java.awt.Robot里面的游戲?

[英]java.awt.Robot inside games?

我正在嘗試使用下面的代碼模擬擊鍵。 當我打開記事本它工作正常,但當我打開我想要使用它的游戲時,它什么也沒做。 所以按鍵似乎不起作用。 我試圖模擬鼠標移動和點擊,這些動作確實有效。 有誰知道如何解決這個問題?

我發現了這個問題, 如何在游戲中使用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);

    }

}

您可能希望按下並釋放鍵以模擬擊鍵,即您的當前代碼將按住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);
    }
}

任何時候人們遇到沒有在程序上注冊的java.awt.Robot方法的問題,很可能是因為這些方法沒有釋放鍵/鼠標筆划或者在按下/釋放之間沒有延遲。 這適用於鼠標點擊和擊鍵。

有兩件事要檢查 -

  1. 如果你正在使用robot.keyPress(key)確保在某些時候有一個robot.keyRelease(key)

  2. 確保PressRelease之間有足夠大的延遲延遲。 經驗法則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);

與上面相反 - 你在哪里添加你的密鑰監聽器?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM