java.awt.Robot
클래스를 사용하여 자동화를 기반으로하는 몇 가지 코드를 검토하고있었습니다. 코드가 완벽하게 실행되었지만 일부가 main
으로 실행되지 않는 코드를 일부 변경했을 때 코드가 부분적으로 작업을 끝내는 것처럼 보였지만 컴퓨터가 종료 시퀀스를 시작하여 모든 프로그램을 종료했습니다. "Waiting For ..."화면에서 취소를 클릭해서 만 멈출 수있었습니다. 아래 코드가 왜 이런 일이 일어날 수 있는지 당신이 알고 있습니까?왜이 Java 로봇 코드가 내 컴퓨터를 종료합니까?
이 코드는 내가 추가/제거/변경하기 전에 완벽하게 작동했습니다.
정확히 그대로 붙여 넣기 때문에 특정 문제가 발생했습니다. 긴 게시물을 유감으로 생각합니다.
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);
}
}
응용 프로그램 창이 활성화되어 있지 않으면 ALT F4가 종료됩니다. – assylias
@assylias는 의미가 있지만 메모장 창이 포커스를 잃게되는 원인은 무엇입니까? – Starwarswii
아마도 ALT-TAB과 같이 실수로 잘못된 키 코드를 보내고있는 것입니다. ALT-F4와 그 이후의 모든 부분을 제거/주석 처리하고, 키 테스트 사이에 지연을 추가하여 (쉽게 테스트 할 수 있도록) 실행하고 실행하여 기능을 확인하십시오. – immibis