簡體   English   中英

Java 系統范圍的鍵盤快捷鍵

[英]Java System-Wide Keyboard Shortcut

有沒有辦法或庫來獲得系統范圍(全局)鍵盤快捷鍵以在 Java 應用程序中執行操作?

我是 JIntellitype 的作者,我可以告訴你一個事實,這必須在 DLL 中本地完成,並像 JIntellitype 那樣從 Java JNI 調用。 這是 JDK 中未實現的操作系統級掛鈎,因此必須使用 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);

代碼示例來自這里

更新:我不知道您是否可以從 JVM 外部掛鈎事件。 我認為 Swing/AWT 組件必須具有焦點才能使其工作。

您需要掛鈎 Java AWT 事件隊列,以絕對確保您可以獲得全局(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
    }
}

我認為可能還有其他方法可以通過動作地圖完成全局按鍵操作。 我實際上使用了上面的方法

對於 Windows,您需要一個鍵盤鈎子 dll。 您可以從 java 初始化您的 dll,這將導致它注冊偵聽器。 你會得到你需要的。 檢查 msdn 中的 dll 掛鈎或鍵盤掛鈎。 其中之一應該設置你。

對於 linux 我認為這應該更容易,但我自己從未做過。

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

谷歌關於“linux 監聽全局按鍵”的第一個結果(沒有引號)出現了一些我認為可以幫助你解決 X11 環境的問題

OSX 可能只能使用接近於此的解決方案。 但最后,您可能需要為每個平台提供一個 dll,除非 JNA 可以毫無問題地做到這一點,否則最糟糕的事情已經過去了。

JDIC(Java 桌面集成)可以提供幫助
https://jdic.dev.java.net/

對我來說似乎有點無人維護。 我不確定。
如果有人知道更多,請舉報!
我也對這個功能很感興趣。

您現在可以使用 JNA - 請參閱https://github.com/tulskiy/jkeymaster

我已經在 Windows 10 筆記本電腦上輕松完成了這項工作——我沒有在其他平台上親自測試過——顯然它也適用於 MacOS 和“基於 X11 的系統(理論上,僅在一些 Linux 發行版和 PCBSD 上測試過)” .

設置應該不難 - 您需要 slf4j 才能運行它。

您不應該需要構建 jar。

例如,此代碼有效地禁用了“f”鍵並記錄了您按下它的事實。

import com.tulskiy.keymaster.common.Provider;
import com.tulskiy.keymaster.common.HotKeyListener;
import com.tulskiy.keymaster.common.HotKey;
import javax.swing.*;

// ...          

Provider provider = Provider.getCurrentProvider(false); 
    provider.register(KeyStroke.getKeyStroke("F"), new HotKeyListener() {
            public void onHotKey(HotKey hotKey) {
                System.out.println(hotKey);
            }
        });

我希望這有助於某人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM