Java アプリケーションでアクションを実行するためのシステム全体 (グローバル) のキーボード ショートカットを取得する方法またはライブラリはありますか?
7 に答える
私は JIntellitype の作成者であり、JIntellitype が行うように、これを DLL でネイティブに実行し、Java JNI から呼び出す必要があるという事実をお伝えできます。これは JDK に実装されていない OS レベルのフックであるため、JIntellitype や jxGrabKey などのライブラリを使用する必要があります。私の知る限り、OSX 用に書いた人はまだいません。
JIntellitype は Github のオープン ソースです。その仕組みを知りたい場合は、ソースコードをチェックしてください。
ありませんが、Windowsではこれを使用できます:
残念ながら、Linux と OSX について私が知っていることは何もありません。おそらくそれが、そのままでは Java が付属していない理由です。
他のプラットフォームを見つけた場合は、ここに投稿してください:)
好奇心のために、それで何をしているのですか?
https://github.com/kwhat/jnativehookを見つけました
クロスプラットフォームのようです。
キーの押下をリッスンするためのサンプルコードは次のとおりです。
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
public class GlobalKeyListenerExample implements NativeKeyListener {
public void nativeKeyPressed(NativeKeyEvent e) {
System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
GlobalScreen.unregisterNativeHook();
}
}
public void nativeKeyReleased(NativeKeyEvent e) {
System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}
public void nativeKeyTyped(NativeKeyEvent e) {
System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
}
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
}
catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
System.exit(1);
}
GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
}
}
修飾子のチェックは、ビット マスクに基づいています (知っておくべきですが、常に忘れてしまいます :-P):
boolean isAltPressed = (e.getModifiers() & NativeKeyEvent.ALT_MASK) != 0;
boolean isShiftPressed = (e.getModifiers() & NativeKeyEvent.SHIFT_MASK) != 0;
これを KeyCode と組み合わせることができます。
if (e.getKeyCode() == NativeKeyEvent.VK_2 && isShiftPressed && isAltPressed){...}
これはここからの変更例です
また、デフォルトのロギング動作を変更する必要があります。そうしないと、コンソールにスパムが送信されます。
// Get the logger for "org.jnativehook" and set the level to warning.
Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());
logger.setLevel(Level.WARNING);
// Don't forget to disable the parent handlers.
logger.setUseParentHandlers(false);
コード例はこちらから
Windows の場合、キーボード フック dll が必要です。Java から dll を初期化できます。これにより、リスナーが登録されます。必要なものが手に入ります。msdn で dll フックまたはキーボード フックを確認します。それらの1つがあなたを設定するはずです。
Linux の場合、これは簡単だと思いますが、自分でやったことがありません。
http://ubuntuforums.org/showthread.php?t=864566
「Linuxがグローバルキープレスをリッスンする」(引用符なし)に対するGoogleの最初の結果は、X11環境で役立つと思われるものを示しています
OSX は、これに近いソリューションを使用できる可能性があります。しかし、最終的には、おそらくすべてのプラットフォームに dll が必要になるでしょう。JNA が問題なくこれを実行できない限り、最悪の事態が発生します。
更新: JVM の外側からイベントをフックできるかどうかはわかりません。これが機能するには、Swing/AWT コンポーネントにフォーカスが必要だと思います。
Java AWT Event Queue をフックして、グローバル (jvm 全体) のキープレスを確実に取得できるようにする必要があります。
使用する
EventQueue ev = Toolkit.getSystemEventQueue();
// MyCustomEventQueue extends EventQueue and processes keyboard events in the dispatch
ev.push(new MyCustomEventQueue());
class MyEventQueue extends EventQueue
{
protected void dispatchEvent(AWTEvent event)
{
// all AWTEvents can be indentified by type, KeyEvent, MouseEvent, etc
// look for KeyEvents and match against you hotkeys / callbacks
}
}
アクション マップを使用してグローバル キーを押す方法は他にもあると思います。私は実際に上記のメーターを使用しました
JDIC(Java Desktop Integration)はhttps://jdic.dev.java.net/に役立つ可能性があります
私には少し手入れが行き届いていないようです。わからない。
誰かがもっと知っているなら、報告してください!
この機能にも非常に興味があります。