[英]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.