Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.awt.Robot内部游戏?_Java_Windows_Awtrobot - Fatal编程技术网

java.awt.Robot内部游戏?

java.awt.Robot内部游戏?,java,windows,awtrobot,Java,Windows,Awtrobot,我试图用下面的代码模拟击键。当我打开记事本时,它工作正常,但当我打开我想使用它的游戏时,它什么也不做。所以按键似乎不起作用。我试着模拟鼠标移动和点击,这些动作确实有效。有人知道如何解决这个问题吗 我发现了这个问题,但我不能添加任何评论或任何东西 package MyProject; import java.awt.AWTException; import java.awt.Robot; import java.awt.event.KeyEvent; public class KeyStrok

我试图用下面的代码模拟击键。当我打开记事本时,它工作正常,但当我打开我想使用它的游戏时,它什么也不做。所以按键似乎不起作用。我试着模拟鼠标移动和点击,这些动作确实有效。有人知道如何解决这个问题吗

我发现了这个问题,但我不能添加任何评论或任何东西

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

与上述相反-您在哪里添加关键侦听器??

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

    }
}

产出令人惊讶


每当人们遇到java.awt.Robot
方法没有在程序上注册的问题时,很可能是因为这些方法没有释放按键/鼠标笔划,或者在按下/释放之间没有延迟。这同样适用于鼠标单击和按键

有两件事需要检查-

  • 如果您使用的是
    robot.keyPress(键)
    请确保在某个时候有
    robot.keyprelease(键)
    跟随

  • 确保在按下
    和释放
    之间有足够大的延迟。经验法则
    100 ms

  • 例子 不正确
    机器人。按键(键);//没有钥匙释放装置

    robot.keyPress(key); 
    robot.keyRelease(key); // no delay
    
    对的
    你能展示一下你是如何模拟击键的吗?awt.Robot需要可见的顶级容器看看这个:@HussainAkhtarWahid'Ghouri'这是一种完全不同的语言…哦,对不起,这段代码只是一个东西,我也试过按键/释放,但那没关系。你的第二个评论是关于在一小段时间内保持沉默,这解决了我的问题。非常感谢@PHPeter如果我的答案解决了你的问题,你可能会接受我的答案,点击勾号的轮廓。OP不想与监听或swing有任何关系-只需
    java.awt.Robot
    。那么。。。你可能会认为我错了,但第一句话是:“我正试图用下面的代码模拟击键。”然后是“有人知道如何解决这个问题吗”。。。关于这个问题,我不认为这是错的。。。即使在要求澄清时,也没有得到任何回应……我不知道你的情况,但对我来说,很明显,模拟击键和听击键是不同的。此外,代码还特别显示了使用
    java.awt.Robot
    ——与您的“解决方案”完全无关的尝试。此外,我显然是对的,因为我有公认的答案。所以,是的,我认为你错了。读得好的人肯定会知道java.awt.robot使用KeyEvents来模拟KeyEvents。。。所以,我认为你是对的。。。。。
    robot.keyPress(key); 
    robot.keyRelease(key); // no delay
    
    robot.keyPress(key);
    Thread.sleep(100) // or robot.delay(100);
    robot.keyRelease(key);