0、測試環境
VS2015專業版,基於對話框的MFC程序,
例子地址:http://pan.baidu.com/s/1qX9IRec
1、MFC工程設置
類向導->消息->WM_HOTKEY->添加處理程序->確定或編輯代碼
執行后MFC工程會生成下面的代碼
//-------------------MFC_TESTDlg.h afx_msg void OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2); //聲明消息處理函數 //-------------------MFC_TESTDlg.cpp ON_WM_HOTKEY() //消息映射宏,綁定消息與相應處理函數 void CMFC_TESTDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2) //實現消息處理函數 { // TODO: 在此添加消息處理程序代碼和/或調用默認值 CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2); }
2、添加熱鍵注冊/取消代碼
2.1、熱鍵注冊/取消API
//Defines a system-wide hot key. BOOL WINAPI RegisterHotKey(//https://msdn.microsoft.com/en-us/library/ms646309(v=vs.85).aspx _In_opt_ HWND hWnd, //接收熱鍵觸發事件的窗口句柄 _In_ int id, //熱鍵的ID,應用程序ID范圍 [0x0000,0xBFFF].DLL范圍[0xC000~0xFFFF] _In_ UINT fsModifiers, //聲明組合鍵中的 Alt(MOD_ALT)、Ctrl(MOD_CONTROL)、Shift(MOD_SHIFT)、Win鍵(MOD_WIN)、MOD_NOREPEAT 或者其組合 _In_ UINT vk //普通按鍵的代碼(例如'A'),其他見https://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx ); //Frees a hot key previously registered by the calling thread. BOOL WINAPI UnregisterHotKey(//https://msdn.microsoft.com/en-us/library/ms646327(v=vs.85).aspx _In_opt_ HWND hWnd, //接收熱鍵觸發事件的窗口句柄 _In_ int id //熱鍵的ID
2.2、API使用舉例
熱鍵的注冊可以放在OnInitDialog()函數或者WM_CREATE事件處理函數中,取消注冊可以放在WM_DESTROY事件處理函數中。
//WM_CREATE Event Proc Handler int CMFC_TESTDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialogEx::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您專用的創建代碼 //注冊熱鍵 Ctrl + S(s) RegisterHotKey(this->GetSafeHwnd(), 1001, MOD_CONTROL, 'S'); RegisterHotKey(this->GetSafeHwnd(), 1002, MOD_CONTROL, 's'); //注冊熱鍵 Ctrl + F1(不重復,不會連續收到多次) RegisterHotKey(this->GetSafeHwnd(), 1003, MOD_CONTROL | MOD_NOREPEAT, VK_F1); return 0; } //WM_DESTROY Event Proc Handler void CMFC_TESTDlg::OnDestroy() { CDialogEx::OnDestroy(); // TODO: 在此處添加消息處理程序代碼 //解除熱鍵注冊 UnregisterHotKey(this->GetSafeHwnd(), 1001); UnregisterHotKey(this->GetSafeHwnd(), 1002); UnregisterHotKey(this->GetSafeHwnd(), 1003); }
3、修改熱鍵處理函數
void CMFC_TESTDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2) { // TODO: 在此添加消息處理程序代碼和/或調用默認值 switch (nHotKeyId) { case 1001: case 1002: //proc Ctrl + S here break; case 1003: //proc Ctrl + F1 here break; default: break; } CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2); }
----------------------------------------------
參考資料:
http://blog.csdn.net/wangjieest/article/details/6910166
MSDN