Java 原生 API 不支援為應用程式註冊全域熱鍵。若要實現此功能,傳統做法需透過 JNI 撰寫 C/C++ 程式碼,對不熟悉原生開發的 Java 開發者門檻極高。所幸開源社群已提供 JIntellitype 第三方函式庫,封裝好底層實作,讓我們純 Java 即可輕鬆註冊全域熱鍵。
JIntellitype 官網可能無法存取,可從備份來源下載(如 JB51 下載頁)。函式庫包含兩部分:
jintellitype.jar:Java 介面層JIntellitype.dll (32位元) 與 JIntellitype64.dll (64位元)關鍵配置步驟:將兩個 DLL 檔同時放入專案的 com.melloware.jintellitype 套件目錄下。如此程式即可同時相容 32/64 位元系統,無需額外判斷邏輯。
package com.jebysun.globlehotkey;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import com.melloware.jintellitype.HotkeyListener;
import com.melloware.jintellitype.JIntellitype;
/**
* 利用 JIntellitype 實現全域熱鍵設定
* @author Jeby Sun
*/
public class GlobleHotKeyDemo extends JFrame {
private static final long serialVersionUID = 1L;
// 熱鍵識別碼,用於多熱鍵時區分觸發來源
public static final int FUNC_KEY_MARK = 1;
public static final int EXIT_KEY_MARK = 0;
JButton msgBtn;
JButton exitBtn;
public GlobleHotKeyDemo() {
this.setTitle("全域熱鍵設定示範");
this.setBounds(100, 100, 600, 400);
this.setLayout(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 彈出訊息按鈕 (Alt+S)
msgBtn = new JButton("彈出框(Alt+S)");
msgBtn.setMargin(new Insets(0,0,0,0));
msgBtn.setFocusable(false);
msgBtn.setBounds(20, 20, 120, 30);
msgBtn.addActionListener(e -> showMessage());
this.add(msgBtn);
// 退出按鈕 (Alt+Q)
exitBtn = new JButton("退出(Alt+Q)");
exitBtn.setMargin(new Insets(0,0,0,0));
exitBtn.setFocusable(false);
exitBtn.setBounds(160, 20, 120, 30);
exitBtn.addActionListener(e -> System.exit(0));
this.add(exitBtn);
// 步驟 1:註冊熱鍵
// 參數:識別碼、修飾鍵、主鍵
JIntellitype.getInstance().registerHotKey(FUNC_KEY_MARK, JIntellitype.MOD_ALT, (int)'S');
JIntellitype.getInstance().registerHotKey(EXIT_KEY_MARK, JIntellitype.MOD_ALT, (int)'Q');
// 步驟 2:新增熱鍵監聽器
JIntellitype.getInstance().addHotKeyListener(new HotkeyListener() {
@Override
public void onHotKey(int markCode) {
switch (markCode) {
case FUNC_KEY_MARK:
showMessage();
break;
case EXIT_KEY_MARK:
System.exit(0);
break;
}
}
});
this.setVisible(true);
}
private void showMessage() {
JOptionPane.showMessageDialog(null,
"就算把視窗最小化,按快捷鍵 Alt+S 也可以彈出提示框哦!",
"彈出框標題",
JOptionPane.INFORMATION_MESSAGE);
}
public static void main(String[] args) {
new GlobleHotKeyDemo();
}
}
registerHotKey(id, modifiers, keyCode)HotkeyListener 介面處理觸發事件| 常數 | 對應按鍵 |
|---|---|
MOD_ALT | Alt 鍵 |
MOD_CONTROL | Ctrl 鍵 |
MOD_SHIFT | Shift 鍵 |
MOD_WIN | Win/Command 鍵 |
修飾鍵可組合使用,例如 MOD_ALT | MOD_CONTROL 代表 Alt+Ctrl 組合。
unregisterHotKey() 釋放資源