我正在开发一个程序,以类似人类的方式模拟Java中的按键。目标是每 x 秒发送一次随机按键(x 是两个整数之间的随机数)。这是我到目前为止的代码:
public class AutoKeyboard {
public static int randInt(int min, int max) { // Method to generate random int
int randomNum = rand.nextInt((max - min) + 1) + min;
return randomNum;
}
public static void main(String[] args) throws InterruptedException {
int running = 1;
while (running == 1) {
try {
int delay = randInt(336415,783410); // Generates random int between two integers
Robot robot = new Robot();
Thread.sleep(delay); // Thread sleeps for x (random int) milliseconds
robot.keyPress(KeyEvent.VK_SPACE); // Simulating press of space bar
} catch (AWTException e) {
e.printStackTrace();
}
}
}
}
我想实现的是随机Keyevent.VK_SPACE,因此它可以是列表中的任何键而不是空格键(例如,它会按 A-D 中的随机键)。我将如何做到这一点?我想不出我已经拥有的编程知识的逻辑解决方案(可悲的是,这是最小的)
感谢您的任何回复。
你可以定义一个数组(或者如果你愿意的话,也可以定义一个列表),一些(final static
会很好),包含您希望能够按下的所有可能的键。这可能相当冗长,但使您可以灵活地使用所需的任何密钥:
int possibleKeys = new int[]{
KeyEvent.VK_SPACE,
KeyEvent.VK_0,
KeyEvent.VK_A,
KeyEvent.VK_UP
};
您甚至可以对共享相同 ASCII 值的常量使用相应的字符:
int possibleKeys = new int[]{
' ',
'0',
'A', // careful not to use 'a' though!
KeyEvent.VK_UP
};
然后只需从该数组中选择一个随机键代码:
Random rand = new Random();
int i = rand.nextInt(possibleKeys.length);
int keyCode = possibleKeys[i];
另外,我看到您缺少robot.keyPress
后应该完成的robot.keyRelease
:
robot.keyPress(keyCode); // Simulating press of a key
robot.keyRelease(keyCode); // Simulating release of a key
我只会生成一个介于 33 和 126 之间的随机数。然后每对字符随机添加一个 32。32是一个空格。65 - 90 为大写,97-122 为小写。
好资源:http://www.asciitable.com/
要生成一个随机数,我将:
Random randomGenerator = new Random();
int ran = randomGenerator.nextInt(126 - 33);
ran += 33;
然后 ran 将是你的随机角色。你可以有一个循环,做几次。
您甚至不需要使用KeyEvent.VK_SPACE。如果您使用:
System.out.println(KeyEvent.VK_SPACE);
您将获得"32"的回报。这对应于ASCII图表,只需使用它。
由于KeyEvent为键定义了纯整数,因此您可以使用它们而不是KeyEvent.VK_X。那么获得一些随机整数应该不是问题。
请访问 http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/event/KeyEvent.html 以获取钥匙代码。