2009-04-24 7 views
3

Java에서 잠시 동안 키보드 키를 누르고있는 동작을 시뮬레이션하려고합니다. 다음 코드는 5 초 동안 A 키를 누르고 있어야하지만 한 번만 누르면됩니다 (메모장에서 테스트 할 때 하나의 'a'가 생성됩니다). 어떤 아이디어가 다른 것을 사용해야하는지, 아니면 내가 awt.Robot 클래스를 여기에서 잘못 사용하고 있다면?Java에서 누른 키 시뮬레이션

Robot robot = null; 
robot = new Robot(); 
robot.keyPress(KeyEvent.VK_A); 
Thread.sleep(5000); 
robot.keyRelease(KeyEvent.VK_A); 

답변

4

Thread.sleep()은 현재 스레드 (키를 누르고있는 스레드)의 실행을 중지합니다.

주어진 시간 동안 키를 누르고 싶으면 병렬 스레드에서 실행해야합니다. 여기

는 Thread.sleep를() 문제를 해결 얻을 것이다 제안입니다 (다른 명령을 만들고 마음대로과 그들을 교환 할 수 있도록 명령 패턴을 사용) :

public class Main { 

public static void main(String[] args) throws InterruptedException { 
    final RobotCommand pressAKeyCommand = new PressAKeyCommand(); 
    Thread t = new Thread(new Runnable() { 

     public void run() { 
      pressAKeyCommand.execute(); 
     } 
    }); 
    t.start(); 
    Thread.sleep(5000); 
    pressAKeyCommand.stop(); 

    } 
} 

class PressAKeyCommand implements RobotCommand { 

private volatile boolean isContinue = true; 

public void execute() { 
    try { 
     Robot robot = new Robot(); 
     while (isContinue) { 
      robot.keyPress(KeyEvent.VK_A); 
     } 
     robot.keyRelease(KeyEvent.VK_A); 
    } catch (AWTException ex) { 
     // Do something with Exception 
    } 
} 

    public void stop() { 
    isContinue = false; 
    } 
} 

interface RobotCommand { 

    void execute(); 

    void stop(); 
} 
0

java.lang.Robot에는 keyDown 이벤트가 없습니다. 내 컴퓨터 (메모장 대신 리눅스 콘솔에서 테스트)에서이 작업을 시도해 보았습니다. 아마도 이것은 메모장의 문제일까요?

+0

네가 맞아. 온라인으로 java 문서를 보면 keyPress가 키를 누르는 데 사용되며 keyRelease가 동일한 키를 릴리스하는 데 사용됩니다. 나는이 문제가 thread.sleep()과 같을 것이라고 생각한다. –

1

그냥 눌러 계속 ?

import java.awt.Robot; 
import java.awt.event.KeyEvent; 

public class PressAndHold { 
    public static void main(String [] args) throws Exception { 
     Robot robot = new Robot(); 
     for(int i = 0 ; i < 10; i++) { 
      robot.keyPress(KeyEvent.VK_A); 
     } 
    } 
} 

에드워드가 제공 한 답변이 도움이 될 것입니다.

관련 문제