簡體   English   中英

為什么此Java Robot代碼會關閉我的計算機?

[英]Why does this Java Robot code shutdown my computer?

我正在用java.awt.Robot類來研究一些基於自動化的代碼。 代碼運行得很好,但是當我更改了一些內容后,其中一些甚至沒有與main運行,代碼似乎部分完成了任務,但是隨后計算機啟動了關閉程序,關閉了所有程序。 我只能通過在“正在等待...”屏幕上單擊“取消”來停止它。 你們中的任何人都不知道為什么下面的代碼會導致這種情況發生嗎?

同樣,在我添加/刪除/更改某些內容之前,此代碼可以完美地工作。

如果有任何特定原因導致此問題,我將按原樣粘貼。 抱歉,很長的帖子。

package _defaultpackage;

import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;

import static java.awt.event.InputEvent.*;
import static java.awt.event.KeyEvent.*;//static import means we can type VK_1 instead of KeyEvent.VK_1

public class JavaRobot {

    static Robot robot;

    public static void main(String[] args) {

        try {robot = new Robot();} catch (Exception e) {}

        robot.setAutoDelay(30);
        robot.setAutoWaitForIdle(true);

        combination(VK_WINDOWS, VK_R);

        paste("notepad");

        hit(VK_ENTER);

        paste("Hello World!\n123");

        robot.delay(2000);

        combination(VK_ALT, VK_F4);

        hit(VK_RIGHT);
        hit(VK_ENTER);

        robot.setAutoDelay(10);
        for (int i = 0; i < 700; i++) {
            robot.mouseMove(i, i);
        }

        System.out.println("Done.");
    }

    static void leftClick() {
        robot.mousePress(BUTTON1_MASK);
        robot.delay(200);
        robot.mouseRelease(BUTTON1_MASK);
        robot.delay(200);
    }

    static void type(String s) {
        byte[] bytes = s.getBytes();
        for (byte b : bytes) {
            int code = b;
            // keycode only handles [A-Z] (which is ASCII decimal [65-90])
            if (code > 96 && code < 123)
                code = code - 32;
            //robot.delay(40);
            robot.keyPress(code);
            robot.keyRelease(code);
        }
    }

    static void hit(int i) {
        robot.keyPress(i);
        robot.keyRelease(i);
    }

    static void combination(int... i) {
        for (int a : i) {
            robot.keyPress(a);
        }
        for (int a : i) {
            robot.keyRelease(a);
        }
    }

    static void paste(String s) {
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(s), null);
        combination(VK_CONTROL, VK_V);

    }

    static void paste(String s, int delay) {//delay is additional delay after auto robot delay
        String[] letters = s.split("");
        for (String a : letters) {
            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(a), null);
            combination(VK_CONTROL, VK_V);
            robot.delay(delay);
        }
    }

    static void pasteRestore(String s) {
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable save = clipboard.getContents(null);
        clipboard.setContents(new StringSelection(s), null);
        combination(VK_CONTROL, VK_V);
        clipboard.setContents(save, null);

    }

    static void pasteRestore(String s, int delay) {
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable save = clipboard.getContents(null);

        String[] letters = s.split("");
        for (String a : letters) {
            clipboard.setContents(new StringSelection(a), null);
            combination(VK_CONTROL, VK_V);
        }
        clipboard.setContents(save, null);

    }




}

我想這個錯誤是在方法combination() 再看一遍:

static void combination(int... i) {
    for (int a : i) {
        robot.keyPress(a);
    }
    for (int a : i) {
        robot.keyRelease(a);
    }
}

當按Alt-f4時,預期用戶會

  1. 按Alt,
  2. 按F4
  3. 釋放F4
  4. 釋放Alt。

在您的情況下,發布的順序與印刷的順序相同。 因此,我將嘗試重新編寫此方法,如下所示:

static void combination(int... c) {
    for (int a : c) {
        robot.keyPress(a);
    }
    for (int i = c.length - 1; i >=0; i--) {
        robot.keyRelease(c[i]);
    }
}

試試吧。 我希望這會起作用。

另外請注意以下幾行:

robot.setAutoDelay(30);
robot.setAutoWaitForIdle(true);

我個人從未使用過這些二傳手。 嘗試沒有他們的工作。 根據我在關閉窗口時的經驗,您實際上並不需要延遲。 一切工作都沒有延遲,甚至更快。 關鍵是您生成的事件的順序正確。

暫無
暫無

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

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