問題タブ [jnativehook]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 交絡キープレスケーパーの事例
バックグラウンド
KmCasterと呼ばれる、スクリーン キャスティング用の基本的なオープンソースのキーボードとマウスのオンスクリーン ディスプレイ デスクトップ アプリケーションの開発:
Swing のKeyおよびMouseリスナーは、アプリケーション自体に向けられたイベントの受信に制限されているため、アプリケーションはJNativeHookライブラリを使用してグローバルなキーボードおよびマウス イベントを受信します。
問題
アプリケーションがフォーカスを失うと、キーを押すたびにではなく、断続的にキーを押すようにユーザー インターフェイスに表示されます。それでもコンソールには、アプリケーションがすべてのキーが押されたことを示しています。
コード
短い自己完結型のコンパイル可能な例:
上記のコードは、実行時に問題を示す小さなウィンドウを生成します。
他のウィンドウに入力して、デモ アプリケーション内でキーを押しても途方に暮れることを確認してください。
環境
- OpenJDK バージョン「14.0.1」 2020-04-14、64 ビット
- XFCE
- アーチ Linux
- JNativeHook 2.1.0
詳細
JNativeHook は独自のスレッドで実行されますが、invokeLater
(またはinvokeAndWait
?) を使用すると、Swing のイベント スレッドで UI の更新が発行されます。
への呼び出しdisableNativeHookLogger()
は関係ありません。デモを実行するときにコンソールをクリーンに保つだけです。
コンソール出力
アプリケーションにフォーカスがあるときのコンソール出力は次のとおりです。
アプリケーションがフォーカスを失ったときのコンソール出力は次のとおりです。
nativeKeyPressed
したがって、アプリケーションにフォーカスがあるかどうかに関係なく、 が呼び出されたときにキーボード イベントが失われないことは明らかです。つまり、JNativeHook も JNI を介したそのイベント バブリングも原因ではないようです。
質問
JLabel
アプリケーションにフォーカスがあるかどうかに関係なく、キーを押すたびにテキストが更新されるようにするには、何を変更する必要がありますか?
アイデア
役立つアイテムには次のものがあります。
getDefaultToolkit().sync();
レンダリング パイプラインを明示的にフラッシュするために呼び出します。paintImmediately( getBounds() )
ラベルを呼び出します。
最初の項目は大きな違いを生んでいるように見えますが、いくつかのキーがまだ欠けているように見えます (ただし、タイピングが速すぎる可能性があります)。レンダリング パイプラインがペイント要求をマージしないようにすることで、キー ストロークの損失を回避できることは理にかなっています。
リサーチ
この問題に関連するリソース: