java.awt.Robot.keyPress用于连续击键

时间:2012-04-09 05:08:21

标签: java eclipse keypress unity3d awtrobot

所以,这是我的问题。我有一个java程序,它会根据用户与Android手机的交互方式向游戏(Unity内置)发送击键消息。 (我的java程序是通过wi-fi进行android交互的监听器)现在,为了做到这一点,我使用java.awt.Robot将keyPresses发送到游戏窗口。我在我的监听程序中编写了以下代码块:

if(interacting)
{
    Robot robot = new Robot();
    robot.keyPress(VK_A);
    robot.delay(20); //to simulate the normal keyboard rate
}

现在,只要用户按下手机的触摸屏,变量interacting就会成立,而我打算实现的是连续的击键消息链传递给游戏(通过监听器)。但是,出于某种原因,这严重影响了性能。我注意到游戏变慢(快速降低帧速率),甚至计算机变得很慢。出了什么问题?我应该在每个robot.keyRelease(VK_A)之后使用keyPress吗?但是我的游戏有一个不同的动作映射到一个键的释放,我不想快速按键和释放;我真正想要的是模拟连续击键,以完全的方式,如果用户手动按下键盘上的A键,它的行为方式。请帮忙。

2 个答案:

答案 0 :(得分:2)

机器人对象实际上将模拟与普通用户相同的键盘和鼠标控制模式。因此,在按下按键的每种情况下都应该释放它。

Robot robot = new Robot();
robot.delay(10000);
robot.keyPress(KeyEvent.VK_WINDOWS);
robot.keyPress(KeyEvent.VK_R);
robot.keyRelease(KeyEvent.VK_R);
robot.keyRelease(KeyEvent.VK_WINDOWS);
robot.delay(2000);
robot.keyPress(KeyEvent.VK_N);
robot.keyRelease(KeyEvent.VK_N);
robot.keyPress(KeyEvent.VK_O);
robot.keyRelease(KeyEvent.VK_O);
robot.keyPress(KeyEvent.VK_T);
robot.keyRelease(KeyEvent.VK_T);
robot.keyPress(KeyEvent.VK_E);
robot.keyRelease(KeyEvent.VK_E);
robot.keyPress(KeyEvent.VK_P);
robot.keyRelease(KeyEvent.VK_P);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
robot.keyPress(KeyEvent.VK_D);
robot.keyRelease(KeyEvent.VK_D);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);

此示例将打开一个记事本窗口。

答案 1 :(得分:1)

是的,如果您按下Robot的某个键,则还需要将其释放。

也许是这些方面的东西?

Robot robot = new Robot();

if(interacting)
{
    robot.keyPress(VK_A);
    robot.delay(20); //to simulate the normal keyboard rate
    robot.keyRelease(VK_A);
    robot.delay(20); //to simulate the normal keyboard rate
}