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)
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;
}
// 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;
}
void CHotKeyDlg::OnDestroy() {
CDialog::OnDestroy();
if (m_hotkeyId) {
UnregisterHotKey(m_hWnd, m_hotkeyId);
GlobalDeleteAtom(m_hotkeyId);
}
}
使用 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) 系統保留,不可註冊。