簡體   English   中英

Java 機器人不按回車鍵應該怎么辦

[英]Java Robot doesnt Press Enter Key how it should

我正在嘗試編寫一個小型機器人,它應該只寫幾個小時相同的短語,但會有延遲。

但不知何故,如果我在 Enter 鍵之前同時有超過 1 個字母,它寧願鍵入一個 Pyramide。

例如,如果我想打印“ted”,它會打印以下內容:

泰德

泰特

泰泰泰

特特特特特

[...]

(金字塔線之間沒有空線)

這真的令人沮喪。

我嘗試了許多解決方案,但都沒有奏效。 為機器人做一個延遲,一個額外的機器人輸入鍵,把它放在一個額外的線程中,或者每次在新的打字之前創建新的機器人。 它只是行不通。 我究竟做錯了什么? 這是一個 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);
}
  1. 盡量不要在循環的每次迭代中初始化您的機器人。 在循環外調用createRobos() 那是除非你有一個特定的理由你這樣做。
  2. 我認為您不需要兩個單獨的 Robot 實例來使其正常工作。
  3. 除了使用Thread.sleep() ,您可以使用Robot class 中的delay()方法。 這是如果您想在Robot方法調用之間添加延遲。

您可能想嘗試在輸入字母鍵和按下回車鍵之間以及按下回車鍵之后添加延遲。 50 - 100 毫秒的延遲通常可以解決問題。 有時,事情會變得有些混亂,尤其是當您將Thread.sleep()投入其中時。

我用這些小改動運行了你的代碼,它似乎工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM