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