要完成的功能是按下系统热键+其他的键可以响应
一.用虚函数添加组合热键
1->在主对话框类添加PreTranslateMessage虚函数来捕获键盘信息
2->设置按键状态宏
#define IsKeyPressed(nVirtKey) ((GetKeyState(nVirtKey) & (1<<(sizeof(SHORT)*8-1))) != 0)
#define IsKeyToggled(nVirtKey) ((GetKeyState(nVirtKey) & 1) != 0)
3->函数中添加消息处理功能
if (pMsg->message == WM_KEYDOWN){
switch(pMsg->wParam)
{
case VK_UP:
MessageBox(_T("您按下了向上键!"));
break;
case VK_DOWN:
default:break;
}
}
if(pMsg->message == WM_KEYDOWN && pMsg->wParam == 'Q' && IsKeyPressed(VK_CONTROL)) {
MessageBox(_T("Ctrl + Q 组合键被按下"));
return TRUE;
}
--------------------------------------------------------------------------------------------------------------------------------------
二.用ID资源注册组合热键
1->在资源编辑器添加Accelerator按键资源取名ID_ACC_1
2->在主对话框OnInitDialog()加载 在.h文件定义HACCEL hAcc
hAcc = LoadAccelerators(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(ID_ACC_1));
3->手动添加消息声明在.h文件中 afx_msg void OnCtrlW();
4->手动添加消息映射ON_BN_CLICKED(ID_ACC_1, &C对话框数据传递Dlg::OnCtrlW)
5->实现消息响应函数
void C对话框数据传递Dlg::OnCtrlW()
{
MessageBox(_T("您按下了 Ctrl+W 键!"));
}
6->在主对话框类添加PreTranslateMessage虚函数来捕获键盘信息
BOOL C对话框数据传递Dlg::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN: // Alt、F10 键
if(TranslateAccelerator(m_hWnd, hAcc, pMsg))
return TRUE;
}
}
7->此种方法适用于需要建立多个组合热键,如果需要第二个组合热键,只需重新添加消息映射,消息声明,实现函数,不过消息映射需要改动的是,第一个参数接受为ID_ACC_1里新建的那个ID,比如
ON_BN_CLICKED(IDR_CRTLA, &C对话框数据传递Dlg::OnCtrlA)
--------------------------------------------------------------------------------------------------------------------------------------
三.注册全局系统热键
1->在主对话框类OnInitDialog()注册全局热键
RegisterHotKey(m_hWnd, 1000, MOD_CONTROL|MOD_ALT, 'W');
2->添加消息声明
afx_msg void OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2);
3->响应目标窗口的 WM_HOTKEY 消息;
void C对话框数据传递Dlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
MessageBox(_T("全局系统热键CTRL+AIT+W"));
CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}
4->在WM_Destory消息中卸载全局热键
void C对话框数据传递Dlg::OnDestroy()
{
CDialogEx::OnDestroy();
UnregisterHotKey(m_hWnd,1000);
// TODO: 在此处添加消息处理程序代码
}