为什么这个 Java 机器人代码会关闭我的计算机?
Why does this Java Robot code shutdown my computer?
我正在使用 java.awt.Robot
class 摆弄一些基于自动化的代码。代码是 运行ning 完美的,但是当我改变一些东西时,其中一些甚至 运行 和 main
都没有,代码似乎部分完成了它的任务,但随后计算机启动了它的关机顺序,关闭所有程序。我只能通过在 "Waiting For..." 屏幕上单击取消来停止它。你们中有人知道为什么下面的代码会导致这种情况发生吗?
同样,这段代码在我 added/removed/changed 之前工作得很好。
我将原样粘贴,以防有任何特定原因导致此问题。很抱歉 post.
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 时,用户应该
- 按 Alt,
- 按 F4
- 释放F4
- 发布 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);
我个人从未使用过这些二传手。尝试在没有它们的情况下工作。根据我关闭 windows 时的经验,您真的不需要延迟。一切都没有延迟,甚至更快。重点是您生成的事件的正确顺序。
我正在使用 java.awt.Robot
class 摆弄一些基于自动化的代码。代码是 运行ning 完美的,但是当我改变一些东西时,其中一些甚至 运行 和 main
都没有,代码似乎部分完成了它的任务,但随后计算机启动了它的关机顺序,关闭所有程序。我只能通过在 "Waiting For..." 屏幕上单击取消来停止它。你们中有人知道为什么下面的代码会导致这种情况发生吗?
同样,这段代码在我 added/removed/changed 之前工作得很好。
我将原样粘贴,以防有任何特定原因导致此问题。很抱歉 post.
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 时,用户应该
- 按 Alt,
- 按 F4
- 释放F4
- 发布 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);
我个人从未使用过这些二传手。尝试在没有它们的情况下工作。根据我关闭 windows 时的经验,您真的不需要延迟。一切都没有延迟,甚至更快。重点是您生成的事件的正确顺序。