在MFC中,对话框程序在完成程序的初始化后,就在程序主线程中,调用CWinThread::Run函数。在该函数中,首先调用API函数PeekMessage,而函数PeekMessage检查线程消息队列,如果消息存在,就将该消息放于指定的MSG结构中,以后的消息处理都将针对这一MSG结构对象。捕获消息后,该函数将捕获的消息进行预处理,然后再将消息传递给相应的窗口处理函数。 键盘消息被拦截而得不到正常响应,其中的关键就是Run函数对消息的预处理。在Run函数中,调用了函数CWinThread::PumpMessage,就是利用这一函数,MFC实现了对消息的分流,使得消息沿着MFC对各种消息规定的路线流动,直到被正确响应。 函数PumpMessage调用了函数CWinThread::PreTranslateMessage对消息进行处理,如果该函数不对消息进行处理,则调用API函数TranslateMessage函数将虚拟键消息转换为字符消息并调用DispatchMessage分发消息给窗口处理程序。在对话框中,程序用CWinThread::PreTranslateMessage函数处理了键盘消息,所以对话框程序是否要响应键盘消息,将完全由CWinThread::PreTranslateMessage函数来决定了。 在CWnd及其派生类的成员函数PreTranslateMessage函数是一个虚函数,可以通过重载来改变其处理过程。在默认情况下,没有重载这一函数。例子如下,在VC6的Class view中找到相应的对话框类单击右键,在右键菜单中选择Add Virtual Fuction...项,然后找到PreTranslateMessage虚函数进行加载。相应的代码中如下:BOOL CKeyinTstDlg::PreTranslateMessage(MSG* pMsg) //CKeyinTstDlg我为自己创建的对话框类{ // TODO: Add your specialized code here and/or call the base classif(WM_KEYFIRST<=pMsg->message&&pMsg->message<=WM_KEYLAST) { m_KeyCode=1; m_KeyName="dsfsdf";MessageBox("有键被按下");pdateData(FALSE); } return CDialog::PreTranslateMessage(pMsg);}