Java 机器人不按回车键应该怎么做
Java Robot doesnt Press Enter Key how it should
我正在尝试编写一个小型机器人,它应该只延迟写几个小时的相同短语。
但不知何故,如果我在 Enter 键之前同时有 1 个以上的字母,它宁愿键入金字塔。
例如,如果我想打印 "ted",它会打印以下内容:
泰德
特德
tedtedted
tedtedtedted
[...]
(金字塔线之间没有空线)
真的很沮丧。
我尝试了很多解决方案,但 none 有效。为机器人做一个延迟,一个额外的机器人用于回车键,将它放在一个额外的线程中或每次在新的打字之前创建新的机器人。它只是不起作用。我究竟做错了什么?
这是我做过一些尝试的 SSCCE:
@SuppressWarnings("CallToPrintStackTrace")
public class RobotTest {
private static Robot robo;
private static Robot okRobo;
static {
createRobos();
}
private static void createRobos(){
try {
robo = new Robot();
okRobo = new Robot();
} catch (AWTException ex) {
ex.printStackTrace();
}
}
@SuppressWarnings({"CallToPrintStackTrace", "SleepWhileInLoop"})
public static void main(String[] args) throws InterruptedException {
Thread.sleep(5000);
for (int i = 0; i < 16; i++) {
createRobos();
perform();
// Thread.sleep(500);
performOk();
}
}
private static void perform() {
robo.keyPress(KeyEvent.VK_SHIFT);
robo.keyPress(KeyEvent.VK_1);
robo.keyRelease(KeyEvent.VK_SHIFT);
robo.keyRelease(KeyEvent.VK_1);
robo.keyPress(KeyEvent.VK_B);
robo.keyRelease(KeyEvent.VK_B);
robo.keyPress(KeyEvent.VK_O);
robo.keyRelease(KeyEvent.VK_O);
robo.keyPress(KeyEvent.VK_O);
robo.keyRelease(KeyEvent.VK_O);
robo.keyPress(KeyEvent.VK_S);
robo.keyRelease(KeyEvent.VK_S);
robo.keyPress(KeyEvent.VK_T);
robo.keyRelease(KeyEvent.VK_T);
robo.keyPress(KeyEvent.VK_E);
robo.keyRelease(KeyEvent.VK_E);
robo.keyPress(KeyEvent.VK_D);
robo.keyRelease(KeyEvent.VK_D);
// robo.waitForIdle();
}
private static void performOk() {
okRobo.keyPress(KeyEvent.VK_ENTER);
okRobo.keyRelease(KeyEvent.VK_ENTER);
// okRobo.waitForIdle();
}
}
这是我的第一次尝试,我认为它也应该有效,但它没有:
public class RobotTest {
private static Robot robo;
@SuppressWarnings("CallToPrintStackTrace")
static {
try {
robo = new Robot();
} catch (AWTException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
Thread.sleep(5000);
for (int i = 0; i < 16; i++) {
perform();
}
}
private static void perform() {
robo.keyPress(KeyEvent.VK_SHIFT);
robo.keyPress(KeyEvent.VK_1);
robo.keyRelease(KeyEvent.VK_SHIFT);
robo.keyRelease(KeyEvent.VK_1);
robo.keyPress(KeyEvent.VK_B);
robo.keyRelease(KeyEvent.VK_B);
robo.keyPress(KeyEvent.VK_O);
robo.keyRelease(KeyEvent.VK_O);
robo.keyPress(KeyEvent.VK_O);
robo.keyRelease(KeyEvent.VK_O);
robo.keyPress(KeyEvent.VK_S);
robo.keyRelease(KeyEvent.VK_S);
robo.keyPress(KeyEvent.VK_T);
robo.keyRelease(KeyEvent.VK_T);
robo.keyPress(KeyEvent.VK_E);
robo.keyRelease(KeyEvent.VK_E);
robo.keyPress(KeyEvent.VK_D);
robo.keyRelease(KeyEvent.VK_D);
robo.keyPress(KeyEvent.VK_ENTER);
robo.keyRelease(KeyEvent.VK_ENTER);
robo.delay(500);
}
- 尽量不要在每次循环迭代时都初始化您的机器人。在循环外调用
createRobos()
。那是除非你有特定的理由这样做。
- 我不认为你需要两个单独的 Robot 实例来让它工作。
- 您可以在
Robot
class 中使用 delay()
方法,而不是使用 Thread.sleep()
。如果您想在 Robot
方法调用之间添加延迟。
您可能想尝试在输入字母键和按下回车键之间以及按下回车键之间添加延迟。 50 - 100 毫秒的延迟通常可以解决问题。有时,事情会变得有点混乱,尤其是当你把 Thread.sleep()
扔进去的时候。
我 运行 你的代码做了这些小改动,看起来工作正常。
我正在尝试编写一个小型机器人,它应该只延迟写几个小时的相同短语。
但不知何故,如果我在 Enter 键之前同时有 1 个以上的字母,它宁愿键入金字塔。
例如,如果我想打印 "ted",它会打印以下内容:
泰德
特德
tedtedted
tedtedtedted
[...]
(金字塔线之间没有空线)
真的很沮丧。
我尝试了很多解决方案,但 none 有效。为机器人做一个延迟,一个额外的机器人用于回车键,将它放在一个额外的线程中或每次在新的打字之前创建新的机器人。它只是不起作用。我究竟做错了什么? 这是我做过一些尝试的 SSCCE:
@SuppressWarnings("CallToPrintStackTrace")
public class RobotTest {
private static Robot robo;
private static Robot okRobo;
static {
createRobos();
}
private static void createRobos(){
try {
robo = new Robot();
okRobo = new Robot();
} catch (AWTException ex) {
ex.printStackTrace();
}
}
@SuppressWarnings({"CallToPrintStackTrace", "SleepWhileInLoop"})
public static void main(String[] args) throws InterruptedException {
Thread.sleep(5000);
for (int i = 0; i < 16; i++) {
createRobos();
perform();
// Thread.sleep(500);
performOk();
}
}
private static void perform() {
robo.keyPress(KeyEvent.VK_SHIFT);
robo.keyPress(KeyEvent.VK_1);
robo.keyRelease(KeyEvent.VK_SHIFT);
robo.keyRelease(KeyEvent.VK_1);
robo.keyPress(KeyEvent.VK_B);
robo.keyRelease(KeyEvent.VK_B);
robo.keyPress(KeyEvent.VK_O);
robo.keyRelease(KeyEvent.VK_O);
robo.keyPress(KeyEvent.VK_O);
robo.keyRelease(KeyEvent.VK_O);
robo.keyPress(KeyEvent.VK_S);
robo.keyRelease(KeyEvent.VK_S);
robo.keyPress(KeyEvent.VK_T);
robo.keyRelease(KeyEvent.VK_T);
robo.keyPress(KeyEvent.VK_E);
robo.keyRelease(KeyEvent.VK_E);
robo.keyPress(KeyEvent.VK_D);
robo.keyRelease(KeyEvent.VK_D);
// robo.waitForIdle();
}
private static void performOk() {
okRobo.keyPress(KeyEvent.VK_ENTER);
okRobo.keyRelease(KeyEvent.VK_ENTER);
// okRobo.waitForIdle();
}
}
这是我的第一次尝试,我认为它也应该有效,但它没有:
public class RobotTest {
private static Robot robo;
@SuppressWarnings("CallToPrintStackTrace")
static {
try {
robo = new Robot();
} catch (AWTException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
Thread.sleep(5000);
for (int i = 0; i < 16; i++) {
perform();
}
}
private static void perform() {
robo.keyPress(KeyEvent.VK_SHIFT);
robo.keyPress(KeyEvent.VK_1);
robo.keyRelease(KeyEvent.VK_SHIFT);
robo.keyRelease(KeyEvent.VK_1);
robo.keyPress(KeyEvent.VK_B);
robo.keyRelease(KeyEvent.VK_B);
robo.keyPress(KeyEvent.VK_O);
robo.keyRelease(KeyEvent.VK_O);
robo.keyPress(KeyEvent.VK_O);
robo.keyRelease(KeyEvent.VK_O);
robo.keyPress(KeyEvent.VK_S);
robo.keyRelease(KeyEvent.VK_S);
robo.keyPress(KeyEvent.VK_T);
robo.keyRelease(KeyEvent.VK_T);
robo.keyPress(KeyEvent.VK_E);
robo.keyRelease(KeyEvent.VK_E);
robo.keyPress(KeyEvent.VK_D);
robo.keyRelease(KeyEvent.VK_D);
robo.keyPress(KeyEvent.VK_ENTER);
robo.keyRelease(KeyEvent.VK_ENTER);
robo.delay(500);
}
- 尽量不要在每次循环迭代时都初始化您的机器人。在循环外调用
createRobos()
。那是除非你有特定的理由这样做。 - 我不认为你需要两个单独的 Robot 实例来让它工作。
- 您可以在
Robot
class 中使用delay()
方法,而不是使用Thread.sleep()
。如果您想在Robot
方法调用之间添加延迟。
您可能想尝试在输入字母键和按下回车键之间以及按下回车键之间添加延迟。 50 - 100 毫秒的延迟通常可以解决问题。有时,事情会变得有点混乱,尤其是当你把 Thread.sleep()
扔进去的时候。
我 运行 你的代码做了这些小改动,看起来工作正常。