MFC对话框不能响应键盘消息

在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 class
if(WM_KEYFIRST<=pMsg->message&&pMsg->message<=WM_KEYLAST)
 { 
  m_KeyCode=1; 
  m_KeyName="dsfsdf";

MessageBox("有键被按下");
pdateData(FALSE);
 }

 return CDialog::PreTranslateMessage(pMsg);
}

 

转载于:https://www.cnblogs.com/cwbo-win/articles/3394361.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值