問題タブ [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.

0 投票する
1 に答える
84 参照

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() )ラベルを呼び出します。

最初の項目は大きな違いを生んでいるように見えますが、いくつかのキーがまだ欠けているように見えます (ただし、タイピングが速すぎる可能性があります)。レンダリング パイプラインがペイント要求をマージしないようにすることで、キー ストロークの損失を回避できることは理にかなっています。

リサーチ

この問題に関連するリソース: