java - 为什么此 Java Robot 代码会关闭我的计算机?

标签 java automation shutdown awtrobot

我正在使用 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. 释放替代方案。

在您的情况下,释放顺序与按下顺序相同。因此,我尝试重写此方法,如下所示:

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);

我个人从未使用过这些 setter 。尝试在没有他们的情况下工作。根据我的经验,关闭窗口时并不需要延迟。一切工作都没有延迟,甚至更快。重点在于您生成的事件的顺序是否正确。

关于java - 为什么此 Java Robot 代码会关闭我的计算机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28134259/

相关文章:

.net - .NET 中有什么方法可以以编程方式监听 HTTP 流量吗?

c# - 如何模拟Windows关机进行调试?

windows - 在 Windows 关机时执行批处理脚本

java - db2 中的 Oracle rownum - Java 数据归档

java - 为什么 disruptor 使用较小的环形缓冲区会变慢?

Java正则表达式创建问题

selenium - 使用页面对象模型的appium框架的最佳实践是什么

ios - 错误 : Target failed to run: Permission to debug com. apple.Preferences 被拒绝

Java:跟踪操作系统中触及的文件

iOS 关机通知