MFC中如何拦截Alt+?、Ctrl+?、Ctrl+Alt+?、Ctrl+Shift+?、Ctrl+Shift+Alt+?、Shift+?系列的组合键,以及拦截Alt+F4,回车和Esc键

程序的下载地址为:http://download.csdn.net/detail/xing_yufei/5056315

 

看过好多别人写的程序,有支持热键呼叫的,并且热键可以在程序中自定义设定。在热键设定的界面,选中一个编辑框,按下你想设置的热键,编辑框中就会显示出你所按下的热键。按照下面的方法,就可以实现这个功能。

拦截Alt+?组合键比较特殊,因为在这种单纯按下Alt的情况下,产生的消息为WM_SYSKEYDOWN消息

而拦截其它的消息,在WM_KEYDOWN中处理就可以了

具体怎么办呢?需要重载PreTranslateMessage函数

我使用的开发环境为Visual Studio 2008,对基类的虚拟函数进行重载比较方便

切换到类视图,选择CXXXDlg类,右键->属性,点击第六个按钮“重写”,找到PreTranslateMessage,进行重载

然后在PreTranslateMessage函数中添加下列代码,即可完成对热键的拦截

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
 // TODO: 在此添加专用代码和/或调用基类
 if(pMsg->message==WM_SYSKEYDOWN)//Alt+?系列热键
 {
  char keyMap[50]="";
  BOOL bAlt=::GetKeyState(VK_MENU)&0x8000;
  if(bAlt)
  {
   if(pMsg->wParam==VK_F4)//屏蔽Alt+F4
    return true;
   else if(((pMsg->wParam>=0x30)&&(pMsg->wParam<=0x39))||((pMsg->wParam>=0x41)&&(pMsg->wParam<=0x5a)))//Alt+?热键(?在0-9,A-Z)
   {
    sprintf(keyMap,"Alt+%c",pMsg->wParam);
    GetDlgItem(IDC_EDIT)->SetWindowTextA(keyMap);
   }
   else
    GetDlgItem(IDC_EDIT)->SetWindowTextA("无");
  }
  else
   GetDlgItem(IDC_EDIT)->SetWindowTextA("无");
 }
 else if(pMsg->message==WM_KEYDOWN)
 {
  BOOL bCtrl=::GetKeyState(VK_CONTROL)&0x8000;
  BOOL bShift=::GetKeyState(VK_SHIFT)&0x8000;
  BOOL bAlt=::GetKeyState(VK_MENU)&0x8000;
  BOOL bHotKey=bCtrl|bShift|bAlt;//判断是否有热键按下
  char keyMap[50]="";
  if(pMsg->wParam==VK_RETURN)//屏蔽回车
   return true;
  else if(pMsg->wParam==VK_ESCAPE)//屏蔽ESC
   return true;
  else if(bHotKey)
  {
   if(((pMsg->wParam>=0x30)&&(pMsg->wParam<=0x39))||((pMsg->wParam>=0x41)&&(pMsg->wParam<=0x5a)))
   {
    if(bCtrl)
     sprintf(keyMap,"%sCtrl+",keyMap);
    if(bShift)
     sprintf(keyMap,"%sShift+",keyMap);
    if(bAlt)
     sprintf(keyMap,"%sAlt+",keyMap);
    sprintf(keyMap,"%s%c",keyMap,pMsg->wParam);
    GetDlgItem(IDC_EDIT)->SetWindowTextA(keyMap);
   }
   else
    GetDlgItem(IDC_EDIT)->SetWindowTextA("无");
  }
  else
   GetDlgItem(IDC_EDIT)->SetWindowTextA("无");
 }

 return CDialog::PreTranslateMessage(pMsg);
}

注:这种方法无法拦截像Ctrl+Alt+Del的系统热键,如果想拦截这些热键,就比较麻烦了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值