2012-03-23 6 views
2

화면 캡처 유틸리티를 작성 중이며 스크린 샷을 찍을 때마다 키보드와 마우스의 현재 상태를 저장할 수 있어야합니다. .현재 키보드 상태를 전체적으로 어떻게 알 수 있습니까? (묻고있는 응용 프로그램에 포커스가 있는지 여부에 관계없이 현재 어떤 키가 눌려 있는지)

related question에 설명 된 방식으로 PointerInfo 클래스를 사용하면 원하는 경우 현재 마우스 위치 및 클릭 정보의 화면 좌표가 제공되므로 마우스를 사용하면 간단합니다. 그러나, 나는이 클래스의 키보드에 대한 아날로그를 찾을 수 없었습니다. 모든 키보드 관련 클래스는 포커스 특정으로 나타납니다.

Java에서 현재 키보드 상태를 가져 오는 방법이 있습니까?

P. 어떤 우울증 키에 관한 정보를 검색하기 위해 호출 할 함수를 찾고 있다는 것을 기억하십시오. 은 우울증 이벤트에 대한 수신기입니다. 당신이 할 수있는

답변

5

뭔가가 KeyListener 인터페이스를 구현하고 관심있는 모든 키에 상태를 제공합니다.

화살표 키는 예를 들어, 스크린 샷에 우울 경우 확인에 관심이 있다면, 이 KeyListener 인터페이스를 구현하고 keyPressed()keyReleased() 메소드를 무시하고 관심있는 키의 상태를 keyPressed 또는 keyReleased으로 설정하면됩니다. 이벤트에 따라 다릅니다. 그런 식으로 스크린 샷이 발생하면 해당 키의 상태를 읽을 수 있습니다.

이 솔루션이 응용 프로그램 중심인지 여부에 관계없이 글로벌 솔루션이 필요한 경우 C에서 Java Native와 통합 할 수있는 작은 고리를 작성할 수 있습니다 키 이벤트를 수신 대기하는 인터페이스. Java는 리스너를 컴포넌트 및 포커스가있는 컴포넌트에 연결하지 않고도 주요 이벤트를들을 수있게 해줍니다. JNativeHook을 살펴보십시오.

응용 프로그램에 포커스가 있지만 모든 구성 요소에 수신기가 필요하지 않으면 모든 수신기 구성 요소에 청취자를 연결할 수 없거나 자신 만의 사용자 지정 KeyEventDispatcher를 작성하여 KeyBoardFocusManager에 등록 할 수 있습니다. 이렇게하면 특정 포커스가있는 구성 요소에 관계없이 응용 프로그램에 포커스가있는 한 모든 키보드 이벤트를 포착 할 수 있습니다. 참조 :

public class YourFrame extends JFrame {  

    public YourFrame() { 
     // Finish all your layout and add your components 
     // 

     // Get the KeyboardFocusManager and register your custom dispatcher 
     KeyboardFocusManager m = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 

     m.addKeyEventDispatcher(new YourDispatcher()); 
    } 

    private class YourDispatcher implements KeyEventDispatcher { 
     @Override 
     public boolean dispatchKeyEvent(KeyEvent e) { 
      if (e.getID() == KeyEvent.KEY_TYPED) { 
       // Do something to change the state of the key 
      } else if (e.getID() == KeyEvent.KEY_PRESSED) { 
       // Do something else 
      } 
      return false; 
     } 
    } 

    public static void main(String[] args) { 
     YourFrame yF = new YourFrame(); 
     yF.pack(); 
     yF.setVisible(true); 
    } 
} 
+0

신속한 답변을 보내 주셔서 감사합니다! 나는 그것을 밖으로 시도 할 것이다 - 그것이 작동해야하는 것처럼 들린다. – zergylord

+0

인터페이스를 읽으면 특정 Jcomponent에 포커스가있을 때 키를 가로 채기 만하면됩니다. 포커스에 관계없이 세계적으로 * 일컬어지는 키를 듣고 싶습니다. 이를 위해 제안 된 솔루션을위한 방법이 있습니까? – zergylord

+0

Java가 그런 종류의 제어를 제공하지 않을 것이라고 생각합니다. 즉, 응용 프로그램 포커스에 관계없이 KeyListener를 구현합니다. 가장 좋은 방법은 C.와 같은 사용중인 OS에 가까운 언어로 전역 수신기를 작성하는 것입니다. 그런 다음 Java Native Interface를 사용하여 C의 Key 이벤트와 통합하십시오. – ugo