RegisterHotKey函數被用來定義一個系統范圍的熱鍵;那什麼是熱鍵,熱鍵即快捷鍵;至於什麼是快捷鍵,這裡就不進行掃盲了,你可以向度娘咨詢。
BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk);
hWnd:當按下了定義的熱鍵時,會產生一個WM_HOTKEY的消息,而hWnd表示用來接收WM_HOTKEY消息的窗口句柄;如果這個參數為NULL,WM_HOTKEY消息就會扔進調用者線程的消息隊列中,進行消息循環,然後再被處理掉;
id:指定的熱鍵標識符;在調用者線程中,不允許有相同的熱鍵標識符。一個應用程序必須指定一個在0×0000到0xBFFF范圍之內的值;而對於一個共享的DLL來說,必須指定一個在0xC000到0xFFFF范圍之內的值。為了避免定義的熱鍵標識符和其它共享DLL定義的熱鍵標識符沖突了,共享DLL應該使用GlobalAddAtom函數來生成一個熱鍵標識符;
fsModifiers:定義為了產生WM_HOTKEY消息而必須與由vk參數定義的鍵一起按下的鍵;該參數可以指定以下值:
vk:表示熱鍵的虛擬鍵位碼。
返回值說明:當函數調用成功時,返回為非零值;當函數調用失敗時,返回值為0,可以調用GetLastError函數獲得錯誤碼。
創建一個簡單的MFC程序;添加一個按鈕,按鈕處理程序如下:
void CRegisterHotKeyDemoDlg::OnBnClickedOk(){ // Get the hot key id m_iHotKeyId = GlobalAddAtom(wsHotKey) - 0xC000; if (m_iHotKeyId <= 0) return; // Register the hot key m_bRet = RegisterHotKey(m_hWnd, m_iHotKeyId, MOD_CONTROL, 0x46); if (!m_bRet) return;}
添加WM_HOTKEY事件的處理代碼:
void CRegisterHotKeyDemoDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2){ // Handle the hot key message if (nHotKeyId == m_iHotKeyId) { MessageBox(L"This is a demo", L"RegisterHotKey"); } CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);}
在析構函數中添加釋放處理:
CRegisterHotKeyDemoDlg::~CRegisterHotKeyDemoDlg(){ if (m_bRet) { UnregisterHotKey(m_hWnd, m_iHotKeyId); m_bRet = false; } if (m_iHotKeyId > 0) { GlobalDeleteAtom(m_iHotKeyId + 0xC000); m_iHotKeyId = 0; }}
(工程下載)
在實際開發中,我們經常是使用GlobalAddAtom獲得一個id,所以,我們定義了一個全局的字符串變量:
const wchar_t *wsHotKey = L”HotKeyDemo”;
使用GlobalAddAtom獲得的id范圍是0xC000到0xFFFF,而應用程序要求id范圍為0×0000到0xBFFF,所以,使用GlobalAddAtom獲得的id減去0xC000就能得到一個在范圍為0×0000到0xBFFF之內的id。當使用GlobalAddAtom之後,必須對應的需要使用GlobalDeleteAtom刪除對應的id;同理,當使用RegisterHotKey注冊了一個熱鍵,程序退出時,也需要使用UnregisterHotKey注銷對應的熱鍵。
當某鍵被接下時,系統在所有的熱鍵中尋找匹配者。一旦找到一個匹配的熱鍵,系統將把WM_HOTKEY消息傳遞給登記了該熱鍵的線程的消息隊列。該消息被傳送到隊列頭部,因此它將在下一輪消息循環中被移去。該函數不能將熱鍵同其他線程創建的窗口關聯起來。
若為一熱鍵定義的擊鍵己被其他熱鍵所定義,則RegisterHotKey函數調用失敗。
若hWnd參數標識的窗口已用與id參數定義的相同的標識符登記了一個熱鍵,則參數fsModifiers和vk的新值將替代這些參數先前定義的值。
最後,感歎人生,為什麼有的時候不能做自己喜歡做的事情呢?