函数功能:在基于对话框的MFC程序中实现按键响应,键盘按下哪个键,将其键码显示出来。(未对除数字键和字母键之外的其他键进行屏蔽)

方法:右键点击对话框类-》add virtual function(添加虚拟函数)-》PreTranslateMessage

代码:

BOOL CKEY_DOWNDemoDlg::PreTranslateMessage(MSG* pMsg) 
{
 // TODO: Add your specialized code here and/or call the base class
 CString keyCode;
 if(pMsg->message == WM_KEYDOWN)
 {
  UINT nChar = (UINT)pMsg->wParam;
  keyCode.Format("%c",nChar);
  keyCode.MakeLower();
  MessageBox(keyCode,"KeyPressed",MB_OK);
 }
 return CDialog::PreTranslateMessage(pMsg);
}

备注:

  1. 在基于对话框的MFC程序中,直接添加键盘响应事件(eg:WM_KEYDOWN,WM_CHAR),这种做法系统是无法响应的, 因为MFC在进行设计的时候,这两个消息被对话框上的控件截获了,不能到达这两个消息响应函数,对于OnKeyDown来说,只要把对话框上的控件都删除了,就可以接收到WM_KEYDOWN消息,但是还是接收不到WM_CHAR消息。

    正确的做法是重载PreTranslateMessage()虚函数(或者在PreTranslateMessage这个函数里面加上SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);这一句后,对话框的OnKeyDown和OnChar函数就生效了。OnKeyDown在OnChar之前处理。)。

  2. http://baike.baidu.com/view/2156843.htm

     通过百度搜索WM_KEYDOWN得知:wParam 指定非系统键的虚拟键码, lParam 指定重复次数,扫描码,扩展键标识符,上下文代码,前一键状态标识符,以及转换状态标识符。

    所以要取得按键键码,直接强制转换wParam就行。

  3. WM_KEYDOWN、WM_KEYUP和WM_CHAR

    三个消息的执行顺序为WM_KEYDOWN、WM_CHAR、WM_KEYUP