26

Java アプリケーションでアクションを実行するためのシステム全体 (グローバル) のキーボード ショートカットを取得する方法またはライブラリはありますか?

4

7 に答える 7

17

私は JIntellitype の作成者であり、JIntellitype が行うように、これを DLL でネイティブに実行し、Java JNI から呼び出す必要があるという事実をお伝えできます。これは JDK に実装されていない OS レベルのフックであるため、JIntellitype や jxGrabKey などのライブラリを使用する必要があります。私の知る限り、OSX 用に書いた人はまだいません。

JIntellitype は Github のオープン ソースです。その仕組みを知りたい場合は、ソースコードをチェックしてください。

于 2010-11-16T01:00:27.063 に答える
13

ありませんが、Windowsではこれを使用できます:

ジンテリタイプ

残念ながら、Linux と OSX について私が知っていることは何もありません。おそらくそれが、そのままでは Java が付属していない理由です。

他のプラットフォームを見つけた場合は、ここに投稿してください:)

好奇心のために、それで何をしているのですか?

于 2009-01-19T19:15:21.660 に答える
11

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);

コード例はこちらから

于 2016-10-26T15:48:13.820 に答える
2

Windows の場合、キーボード フック dll が必要です。Java から dll を初期化できます。これにより、リスナーが登録されます。必要なものが手に入ります。msdn で dll フックまたはキーボード フックを確認します。それらの1つがあなたを設定するはずです。

Linux の場合、これは簡単だと思いますが、自分でやったことがありません。

http://ubuntuforums.org/showthread.php?t=864566

「Linuxがグローバルキープレスをリッスンする」(引用符なし)に対するGoogleの最初の結果は、X11環境で役立つと思われるものを示しています

OSX は、これに近いソリューションを使用できる可能性があります。しかし、最終的には、おそらくすべてのプラットフォームに dll が必要になるでしょう。JNA が問題なくこれを実行できない限り、最悪の事態が発生します。

于 2009-02-05T09:07:45.230 に答える
2

更新: 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
    }
}

アクション マップを使用してグローバル キーを押す方法は他にもあると思います。私は実際に上記のメーターを使用しました

于 2009-01-19T19:14:36.573 に答える
1

JDIC(Java Desktop Integration)はhttps://jdic.dev.java.net/に役立つ可能性があります

私には少し手入れが行き届いていないようです。わからない。
誰かがもっと知っているなら、報告してください!
この機能にも非常に興味があります。

于 2009-06-13T17:59:47.340 に答える