2015-01-25 6 views
0

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

    } 




} 
+4

응용 프로그램 창이 활성화되어 있지 않으면 ALT F4가 종료됩니다. – assylias

+0

@assylias는 의미가 있지만 메모장 창이 포커스를 잃게되는 원인은 무엇입니까? – Starwarswii

+1

아마도 ALT-TAB과 같이 실수로 잘못된 키 코드를 보내고있는 것입니다. ALT-F4와 그 이후의 모든 부분을 제거/주석 처리하고, 키 테스트 사이에 지연을 추가하여 (쉽게 테스트 할 수 있도록) 실행하고 실행하여 기능을 확인하십시오. – immibis

답변

2

버그는 combination()에 있습니다. 다시에 살펴 보자 :

누르면 Alt 키-F4 사용자가 예상되는
static void combination(int... i) { 
    for (int a : i) { 
     robot.keyPress(a); 
    } 
    for (int a : i) { 
     robot.keyRelease(a); 
    } 
} 

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

시도해보십시오. 이것이 효과가 있기를 바랍니다.

또한이 라인에주의를 기울 : 저는 개인적으로이 setter를 사용하지

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

. 그들없이 일해보십시오. 창문을 닫을 때 나의 경험에 대해 알리는 것은 정말로 지연을 필요로하지 않는다. 모든 것은 지체없이 그리고 더 빨리 작동합니다. 요점은 올바른 이벤트 순서대로 생성됩니다.

+0

위에서 설명한 @assylias와 마찬가지로 Alt-F4 명령은 창 포커스가 없기 때문에 컴퓨터를 종료합니다. 내가 한 순서대로 키 조합을 누르면 일종의 창에 초점이 맞지 않을 것이라고 생각합니까? 나는이 웹 사이트뿐만 아니라 웹상의 키 조합의 다른 모든 예가 그들을 언론의 순서대로 보여주기 때문에 확실하지 않습니다. 차이가 있다면 첫 번째 키 조합이 정상적으로 작동하는 이유는 무엇입니까? – Starwarswii

+0

네, 그렇게 생각합니다. 그냥 시도해보고 뭘 얻었는지 기뻐할 것입니다. – AlexR

+0

죄송합니다. 위의 의견에 방어적인 소리가 들리면 죄송합니다.지금 그것을 다시 읽으면, 그것은 약간의 의미를 지니고 도전하는 것입니다. 그것은 내가 소리를내는 것을 의미하는 것이 아니 었습니다. 어쨌든, 나는 그것을 시험해 보았다. 그리고 메모장 윈도우의 주 스레드의 주석에 위에서 언급 한이 문제로 인해 때때로 초점을 맞추지 못했지만, 아마도 도움이 될 것이라고 생각한다. 이 대답을 수락 된 것으로 표시합니다. 자동화 된 Alt-F4를 사용하면 아마도 처음에는 좋은 생각이 아님을 알았습니다. – Starwarswii