第九节 组合热键与注册全局热键

第九节 组合热键与注册全局热键

要完成的功能是按下系统热键+其他的键可以响应

一.用虚函数添加组合热键

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: 在此处添加消息处理程序代码
}

你可能感兴趣的:(第九节 组合热键与注册全局热键)