web-dev-qa-db-ja.com

Javaですべてのキーストロークを追跡するキーリスナーを作成するにはどうすればよいですか?

Javaでキーリスナーを作成します。 Javaアプリにフォーカスがあるかどうかに関係なく、すべてのキー押下を追跡する必要があります。これは可能ですか?

16

可能ですが、 [〜#〜] jni [〜#〜] を利用した実装が必要です。これは常に移植可能ではありません。

Java System Hook は、Windows 32ビットおよび64ビットで動作するそのようなライブラリの1つです。

12
Site Helpers

私は少し前にそのようなものを使用しました。 Java System Hook をご覧ください。

JNIを介して(Javaアプリケーション)だけでなく)グローバルキーを追跡します。


KeyListenerはデーモンスレッドとして起動しますが、これはアプリケーションをアライブ状態に維持しません。プログラムで別の非デーモンスレッドを実行する必要があります

例えば:

GlobalKeyListener globalKeyListener = new GlobalKeyListener();
globalKeyListener.addKeyListener(listener);
while (true) {
    Thread.sleep(1000);
}
15
Simiil

いいえ、Javaは、アクティブなウィンドウ以外ではキーストロークにアクセスできません。

これを実現するには、Javaとネイティブコードを組み合わせて、JNIを使​​用してネイティブコードを呼び出す必要があります。MicrosoftWindowsでは、GetAsyncKeyState(key)を確認する必要があります。

4

非常に可能ですが、標準のJavaを使用しない場合、ネイティブレベルでオペレーティングシステムと対話する必要があります。

[〜#〜] jna [〜#〜] を使用してWindows User32 APIの SetWindowsHookEx 関数にアクセスするWindowsのトピックを次に示します。

3
pap

いいえ、Javaはアクティブではない(フォーカスされた)ウィンドウでない場合、keystokesをリッスンしないため、それを行うことはできません。

2
Valdas