程序的下载地址为: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的系统热键,如果想拦截这些热键,就比较麻烦了。