一、实现全局热键主要使用以下API(详情查看MSDN):
- 获取热键标识:GlobalAddAtom
- 注册热键:RegisterHotKey
- 注销热键:UnregisterHotKey
- 释放热键标识:GlobalDeleteAtom
二、热键注册/注销步骤
1、ATOM hotKeyId = GlobalAddAtom( _T("myHotKeyId") ) - 0xc000;
// 拿到一个唯一的热键标识 hotKeyId
2、RegisterHotKey(hwnd, hotKeyId, MOD_XXX, VK_XXX);
// 注册全局热键
// hwnd:本程序窗口句柄
// hotKeyId:第1步中获得的热键标识
// MOD_XXX:组合键的标识,例如Ctrl键为:MOD_CONTROL, Shift键为:MOD_SHIFT
// VK_XXX:键盘按键标识,例如F1键为:VK_F1, A键为'A'
3、UnregisterHotKey(hwnd, hotKeyId);
// 注销全局热键
// hwnd:本程序窗口句柄
// hotKeyId:第1步中获得的热键标识
4、GlobalDeleteAtom(hotKeyId);
// 释放掉热键标识 hotKeyId
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
三、成功注册后的热键使用方法
在Windows程序的消息处理函数中处理WM_HOTKEY消息
// 例如在DUILIB的窗体程序里代码如下:
void MainFrame::RegisterHotKey() {
m_HotKeyId1 = GlobalAddAtomW( _T("HotKey1") ) - 0xc000;
m_HotKeyId2 = GlobalAddAtomW( _T("HotKey2") ) - 0xc000;
m_HotKeyId3 = GlobalAddAtomW( _T("HotKey3") ) - 0xc000;
return;
}
LRESULT MainFrame::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) {
LRESULT lRes = 0;
BOOL bHandled = TRUE;
switch( uMsg ) {
...
case WM_HOTKEY:
lRes = OnHotKey(wParam, lParam);
break;
...
}
return lRes;
}
LRESULT MainFrame::OnHotKey(WPARAM wParam,LPARAM lParam) {
LRESULT lRes = 0;
if ( wParam == m_HotKeyId1 ) {
// 该热键按下时的处理
}
else if ( wParam == m_HotKeyId2 ) {
// 该热键按下时的处理
}
else if ( wParam == m_HotKeyId3 ) {
// 该热键按下时的处理
}
...
return lRes;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
四、注意事项
1、当不需要使用热键功能时,例如程序退出,需要注销热键以及释放热键标识。
2、如果需要同时使用多个不同的热键,需要获取多个热键标识,并注册多次,GlobalAddAtom()中的参数自行填写,不要重复。
3、如果程序运行,热键未能生效,可用GetLastError()查看错误码。