首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 系統全域熱鍵註冊與處理實作 (RegisterHotKey)

     編輯:VC 教學

核心 API

BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk);
BOOL UnregisterHotKey(HWND hWnd, int id);
// fsModifiers: MOD_ALT | MOD_CONTROL | MOD_SHIFT | MOD_WIN
// vk: 虛擬鍵碼 (如 'A', VK_F1, VK_SPACE)

實作步驟 (對話框專案範例)

1. 註冊熱鍵 (OnInitDialog)

BOOL CHotKeyDlg::OnInitDialog() {
    CDialog::OnInitDialog();
    // 註冊 Ctrl+Alt+Q,id 使用全域原子避免衝突
    ATOM id = GlobalAddAtom(_T("MyApp_HotKey_Quit"));
    if (!RegisterHotKey(m_hWnd, id, MOD_CONTROL | MOD_ALT, 'Q')) {
        MessageBox(_T("熱鍵註冊失敗,可能已被佔用"));
    }
    m_hotkeyId = id; // 成員變數保存
    return TRUE;
}

2. 訊息映射與處理

// Header
afx_msg LRESULT OnHotKey(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()

// CPP
BEGIN_MESSAGE_MAP(CHotKeyDlg, CDialog)
    ON_MESSAGE(WM_HOTKEY, OnHotKey)
END_MESSAGE_MAP()

LRESULT CHotKeyDlg::OnHotKey(WPARAM wParam, LPARAM lParam) {
    if (wParam == m_hotkeyId) {
        MessageBox(_T("觸發全域熱鍵 Ctrl+Alt+Q"));
        // 執行實際動作:顯示視窗、截圖、退出等
    }
    return 0;
}

3. 註銷熱鍵 (OnDestroy)

void CHotKeyDlg::OnDestroy() {
    CDialog::OnDestroy();
    if (m_hotkeyId) {
        UnregisterHotKey(m_hWnd, m_hotkeyId);
        GlobalDeleteAtom(m_hotkeyId);
    }
}

進階:避免 ID 衝突的最佳實踐

使用 GlobalAddAtom 產生全域唯一 ID:

ATOM id = GlobalFindAtom(_T("MyApp_Unique_HotKey_Name"));
if (id == 0) id = GlobalAddAtom(_T("MyApp_Unique_HotKey_Name"));
RegisterHotKey(hWnd, id, MOD_CONTROL | MOD_SHIFT, 'N');

程式結束時 GlobalDeleteAtom(id)。此法跨進程唯一,防止多開或他程式衝突。

常見問題

  • 熱鍵不觸發:檢查 RegisterHotKey 回傳值;目標視窗必須存在且為前景或背景皆可接收 WM_HOTKEY。
  • 衝突:常見熱鍵 (如 Ctrl+Alt+Del, Win+L) 系統保留,不可註冊。
  • 管理員權限:若目標進程以管理員執行,呼叫端亦需管理員權限才能註冊成功。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved