MFC-PreTranslateMessage截获消息_数组

在MFC中,PreTranslateMessage是虚函数,是用来截获消息的。我们可以通过重载它来处理键盘和鼠标消息

PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当你需要在MFC之前处理某些消息时,常常要在这里添加代码

只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在 

该函数表示在消息处理(TranslateMessge()和DispatchMessage()等)前所作的操作,如果函数返回值为TRUE,那么消息处理即终止,不会调用TranslateMessge()和DispatchMessage()来翻译和分发消息给相应的窗口;若返回值为FALSE,才会调用翻译和分发消息函数

关于消息有两种传递方式:

a.MFC消息,MFC会把所有的消息一条条放到一个AFX_MSGMAP_ENTRY结构中,形成一个数组,该数组存放了所有的消息和与它们相关的参数。也可以说消息是放到消息队列里去了。

b.采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息。这两种方式中只有第一种(穿过消息队列的消息)才受PreTranslateMessage()影响,第二种消息并不会理睬PreTranslateMessage()的存在

 

传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。例如:可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截回车键,wParam中存放的是键盘上字符的虚拟码

 

PeekMessage和GetMessage的区别:

GetMessage在没有消息的时候等待消息,cpu占用率当然低。

PeekMessage没有消息的时候立刻返回,可以在没有消息的时候可以做其他处理,但cpu占用率一般较高

 

实例:

1.添加PreTranslateMessage函数

右击窗口-->类向导

MFC-PreTranslateMessage截获消息_消息处理_02

 

2.代码

BOOL CMFCtestDlg::PreTranslateMessage(MSG* pMsg)  //截获消息
{
    if (pMsg->message == WM_LBUTTONDOWN)
    {
        AfxMessageBox(_T("按下了鼠标左键"));
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}