如何實現全域性熱鍵
阿新 • • 發佈:2019-02-13
要實現系統範圍內的熱鍵功能,可以通過擷取鍵盤的訊息響應事件來實現,但是今天要介紹的是一個專門給用於實現
註冊熱鍵的函式:RegisterHotKey。下面是具體的介紹:
1、介紹第一個函式:RegisterHotKey,該函式定義一個系統範圍的熱鍵。
函式原型:
BOOL RegisterHotKey(
HWND hWnd, //響應該熱鍵的視窗控制代碼
Int id, //該熱鍵的唯一標識
UINT fsModifiers, //該熱鍵的輔助按鍵
UINT vk //該熱鍵的鍵值
);
2、介紹第二個函式:GlobalAddAtom,該函式用於確定第一個函式所需的熱鍵的唯一識別符號。
函式原型:
ATOM GlobalAddAtom(
LPCTSTR lpString //自己設定的一個字串 (不區分大小寫)
);
注:只適用於桌面應用程式。通過向全域性原子表新增一個字串,返回這個字串的唯一識別符號(原子ATOM)。
3、介紹第三個函式:UnregisterHotKey,該函式用於銷燬先前註冊的熱鍵。
函式原型:
BOOL UnregisterHotKey(HWND hWnd,int id);
4、示例:
新建一個基於基本對話方塊的MFC工程,工程名為HotKey。
4.1、在HotKeyDlg.cpp中呼叫介紹的第二個函式定義一個唯一識別符號:
// 熱鍵的識別符號
#define hotKeyID GlobalAddAtom(_T("MyHotkey"))
4.2、在對話方塊標頭檔案HotKeyDlg.h中新增宣告:
afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam); // 熱鍵訊息響應函式的宣告
4.3、在HotKeyDlg.cpp中為上述宣告新增實現函式:
4.4、在HotKeyDlg.cpp中的BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之間新增熱鍵的訊息對映:LRESULT CHotKeyDlg::OnHotKey(WPARAM wParam,LPARAM lParam) { if(hotKeyID == (int)wParam) { AfxMessageBox(_T("按下")); // 在這裡新增熱鍵的處理 } return TRUE; }
BEGIN_MESSAGE_MAP(CHotKeyDlg, CDialog)
……
ON_MESSAGE(WM_HOTKEY,OnHotKey) // 熱鍵的訊息對映
……
END_MESSAGE_MAP()
4.5、切換到ResourceView介面,在對話方塊上新增一個“熱鍵”控制元件,ID為IDC_HOEKEY1,並通過ClassWizard(類嚮導)為其新增一個CHotKeyCtrl型的名為m_HoyKey的控制變數:
4.6、接著在對話方塊上新增一個儲存“按鈕”,ID為IDC_BTN_SAVE,雙擊按鈕,為按鈕新增響應函式:
/************************************************************************/
/* 儲存按鈕 */
/************************************************************************/
void CHotKeyDlg::OnBtnSave()
{
// 登出原有的熱鍵
::UnregisterHotKey(m_hWnd,hotKeyID);
// 獲取新的熱鍵
WORD wvk,wmod;
m_HotKey.GetHotKey(wvk,wmod);
// 註冊新的熱鍵
BOOL result=RegisterHotKey(m_hWnd,hotKeyID,wmod,wvk);
if(!result)
{
MessageBox(_T("註冊熱鍵失敗!"));
}
}
4.7、最後通過Ctrl+W開啟ClassWizard新增訊息WM_ON_DESTROY的響應函式,設定程式退出時登出註冊的熱鍵:
void CHotKeyDlg::OnDestroy()
{
CDialog::OnDestroy();
// 登出熱鍵
::UnregisterHotKey(m_hWnd,hotKeyID);
}
4.8、執行效果圖:
剛開啟
設定熱鍵並儲存
按下Ctrl+W(前面儲存的熱鍵),彈出對話方塊