PreTranslateMessage是针对当前的应用程序(当前window),只有焦点在当前程序时(一般位于桌面最前面的窗口才获得焦点)才能捕捉到键盘消息。
程序没有界面,收不到键盘消息。
而钩子函数(hook)是针对全局键盘消息,即使焦点不在当前程序上也能捕捉到所有的键盘消息。
/*********************************************************
函 数:PreTranslateMessage
描 述:消息处理
传入参数:pMsg
传出参数:NULL
返 回 值:BOOL
**********************************************************/
BOOL CChartP1::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
//---响应回车
if(pMsg->message==WM_KEYDOWN)
if(pMsg->wParam==VK_RETURN)
{
OnCbnSelchangeComboType();
}
//文本框提示
m_ToolTip.RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);
}
在MFC程序中,钩子是一个强大的武器,要小心使用全局钩子,一般使用线程钩子,关键步骤如下:
下面所有代码都在cpp文件中添加:
1、 声明全局钩子变量,全局钩子函数:
HHOOK g_hMyHhook = NULL;
LRESULT CALLBACK MyMouseProc( int nCode,WPARAM wParam,LPARAM lParam);
2、定义全局钩子函数:
LRESULT CALLBACK MyMouseProc( int nCode,WPARAM wParam,LPARAM lParam)
{
if (wParam == WM_LBUTTONDOWN) //举例,截获鼠标左键单击消息
{
}
return CallNextHookEx(g_hMyHhook,nCode,wParam,lParam);//传递消息
}
3、初始化函数中加载钩子
if(g_hMyHhook == NULL)
{
g_hMyHhook = SetWindowsHookEx(WH_MOUSE, MyMouseProc, NULL, GetCurrentThreadId());
4、程序退出卸载钩子
if(g_hMyHhook)
{
UnhookWindowsHookEx(g_hMyHhook);
g_hMyHhook = NULL;
}