Javaから任意のアプリケーションへのキーボードイベントの送信(オンスクリーンキーボード)
-
03-07-2019 - |
質問
Javaを使用してオンスクリーンキーボードの開発に取り組んでいます。このキーボードには、考えられるすべてのキーに対して JComponent
があります。ボタンでマウスダウンが検出された場合、現在フォーカスしているアプリケーションに特定のキーボードコードを送信します。キーボード自体は、装飾のない JFrame
内にあり、常に最前面に設定されています。
Robotクラスを使用して、ネイティブキューでこれらのキーボードイベントをシミュレートできることがわかりました。ただし、この場合、 JComponent
を選択すると、キー押下が JFrame
で受信され、他のアプリケーションで受信できなくなります。
どうすればオンスクリーンキーボードを「常にフォーカスなしで」維持できますか?別のアプローチを使用してキーを押すことは可能ですか?
解決 3
明らかにこれを行う唯一の方法は、Javaからネイティブへの変換を行うJNIレイヤーを持つことです。 Javaには、このような機能を提供する簡単な方法はありません。
これは、JNIを学びたい人のための小規模なサードパーティライブラリにとって興味深い概念かもしれません...
他のヒント
実際のキーボードとマウスのコマンドでゲームボットを制御しようとしたときに jnativehook を見つけました(より「人間らしく」なるため)。
これまでに見つけた唯一の解決策は、すべてのキーをJComponentにして(フォーカスを持たないようにする)、JFrameで次のプロパティを設定することです:
setUndecorated(true);
setFocusableWindowState(false);
setFocusable(false);
enableInputMethods(false);
ロボットクラスを使用する場合、キーをクリックすることで、フォーカスされているウィンドウにイベントを送信できます。唯一の制限は、同じ仮想マシンに属するウィンドウでのみ機能するようであり、他のシステムウィンドウではまったく機能しないことです。
ロボットクラスを使用する前に、ネイティブのsetfocus()またはsetactivewindow()関数を呼び出してフォーカスを移動しようとしましたか?
OSに依存しない方法でこれを行う方法を知りません。 Windowsについては知りませんが、Xプロトコルを介してXサーバーと通信することは可能でしょう。