在MFC中重载PreTranslateMessage时会出现执行两次的情况:
BOOL CXXX::PreTranslateMessage(MSG* pMsg)
{
if(WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)
{
if(pMsg->wParam == VK_UP) //按了向上键
{
do something;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
为了避免执行两次,在程序体内加
if(pMsg->message == WM_KEYDOWN) //按下返回,不然按下和松开都执行一次
return TRUE;
所以最终结果是:
BOOL CXXX::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN) //按下返回,不然按下和松开都执行一次
return TRUE;
if(WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)
{
if(pMsg->wParam == VK_UP) //按了向上键
{
do something;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
需要说明的是如果采用
if(pMsg->message == WM_KEYUP) //松开返回,不然按下和松开都执行一次
return TRUE;
将在关闭程序的时候出现错误,虽然不知道什么原因,我猜大概是没有返回PreTranslateMessage的原因吧。