MFC对键盘消息的处理

    今天想做一个程序用来测试键盘上的按键是否有效,因为对于字符键来说,可以用文本输入的方法测试其是否正常,但对于控制键来说这个就不太容易,所以想设计一个程序来测试下,用VC6创建一个基于对话框的程序,结果发现对于不能直接响应键盘按键的消息。      
    原来,在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(pMsg->message == WM_KEYDOWN)   
     {    
m_KeyCode=1;   
 
m_KeyName="dsfsdf";  
MessageBox("有键被按下"); 
UpdateData(FALSE);  
      }   
      return CDialog::PreTranslateMessage(pMsg); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值