2009-08-16 4 views
1

구성 요소 수준이 아닌 응용 프로그램 수준에서 키 이벤트를 통보받을 수 있습니까? 응용 프로그램 수준에서 의미하는 것은 스윙 구성 요소가 키 이벤트를받지 않지만 특수 클래스가 시스템 전체의 키 이벤트를 수신하도록하는 것입니다.Java의 응용 프로그램 수준에서 주요 이벤트

예를 들어 GUI가없는 앱에서나 키 이벤트의 글로벌 처리가 필요할 때 사용할 수 있습니다.

+0

당신은 당신이 듣고 싶은 이벤트에 대한보다 구체적인해야합니다. 내가 생각할 수있는 보편적 인 유일한 것에 관해서는 종료입니다. –

답변

0

네이티브 자바에서 가능한지 확실하지 않은 경우 : Windows에서 키 이벤트를 시스템 (글로벌) 수준으로 연결하기 위해 DLL을 만들어야합니다. Unix 또는 MacOS에서는 다른 메커니즘이라고 가정합니다. 이 작업을 수행하려면 저급 시스템 API에 인터페이스해야합니다.

+0

이 과정이 어렵습니까? Win32 프로그래밍에 대한 경험이 없습니다. 무서워요. –

-1

신호는 보편적 인 개념이 아니지만 모든 곳에서 사용되지 않으면 종료를위한 ctrl + c와 같은 특정 신호가 널리 보급되어 있습니다. 이 특정 신호는 셧다운 훅을 사용하여들을 수 있습니다. Runtime.addShutdownHook (Thread)를 호출하면 (자), 이유를 불문하고 VM가 닫혀지고있는 것을 알 수있어 그 이벤트로 무언가를 할 수 있습니다.

2

java.awt.Toolkit의 addAWTEventListener() 메소드를 사용하여 응용 프로그램에 전역 이벤트 수신기를 추가 할 수 있습니다. 응용 프로그램이 포커스가있을 때

http://java.sun.com/javase/6/docs/api/java/awt/Toolkit.html#addAWTEventListener%28java.awt.event.AWTEventListener,%20long%29

은 물론이 경우에만 작동합니다.

그래서 키 이벤트를 다음과 같이 사용할 수 있습니다

public class MyGlobalKeyListener implements AWTEventListener { 
    public void eventDispatched(AWTEvent event) { 
     // do something here 
    } 
} 

// Then on startup register. 
AWTEventListener myGlobalKeyListener = new MyGlobalKeyListener(); 

Toolkey.getDefaultToolkit().addAWTEventListener(myGlobalKeyListener, AWTEvent.KEY_EVENT_MASK); 
+0

흠 ... 처음부터 focs를 얻을 gui가 없으면 어떻게됩니까? –

+0

gui가없는 경우 AWT로부터 KeyEvent를 가질 수 없습니다. GUI가없는 키보드의 유일한 사용자 입력은 콘솔에 입력 된 문자를 수신하는 System.in 스트림에서 직접옵니다. 응용 프로그램에 초점이 맞지 않아도 이벤트를 캡처해야하는 경우 PhiLho가 제안한대로 운영 체제 수준의 후크에 액세스하려면 JNI를 사용해야 할 것입니다. – Aaron

관련 문제