コンポーネントレベルではなく、アプリケーションレベルでキーイベントを通知することは可能ですか?アプリケーションレベルでは、スイングコンポーネントがキーイベントを受け取るのではなく、システムクラスのキーイベントを特別なクラスで受信することが必要です。Javaのアプリケーションレベルの主要イベント
これは、例えば、GUIを持たないアプリで、またはより包括的なキーイベント処理が必要なアプリで使用できます。
コンポーネントレベルではなく、アプリケーションレベルでキーイベントを通知することは可能ですか?アプリケーションレベルでは、スイングコンポーネントがキーイベントを受け取るのではなく、システムクラスのキーイベントを特別なクラスで受信することが必要です。Javaのアプリケーションレベルの主要イベント
これは、例えば、GUIを持たないアプリで、またはより包括的なキーイベント処理が必要なアプリで使用できます。
ネイティブJavaで可能かどうかわかりません:Windowsでは、キーイベントをシステム(グローバル)レベルでフックするDLLを作成する必要があります。UnixまたはMacOSでは異なるメカニズムであると思いますこれを実現するために、低レベルのシステムAPIにインタフェースする必要があります。
このプロセスは難しいですか?私はWin32プログラミングに関する経験がありません。私は恐れています。 –
信号は普遍的な概念ではありませんが、シャットダウンのためのctrl + cなどの特定の信号は、どこでも使用されていなければ広まっています。その特定の信号は、シャットダウンフックを使用して聴くことができます。 Runtime.addShutdownHook(Thread)を呼び出すと、何らかの理由でVMがクローズされていることを知り、そのイベントで何かを行うことができます。
java.awt.ToolkitのaddAWTEventListener()メソッドを使用して、アプリケーションにグローバルイベントリスナーを追加できます。もちろん
アプリケーションにフォーカスがある場合にのみ動作します。
だから、あなたが使用できるキーイベント:
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);
hm ...最初にfocsを得るGUIを持っていないとどうなりますか? –
guiが存在しない場合は、AWTからKeyEventを受け取ることはできません。 GUIのないキーボードの唯一のユーザー入力は、コンソールに入力された文字を受け取るSystem.inストリームから直接得られます。 アプリケーションにフォーカスがない場合でもイベントをキャプチャする必要がある場合は、PhiLhoの提案に従って、JNIを使用してオペレーティングシステムレベルのフックにアクセスする必要があると思います。 – Aaron
あなたはあなたが聴きたいものをイベントについてより具体的にする必要があります。私が考えることができる普遍的な唯一のものはシャットダウンです。 –