【转】在对话框中响应键盘按键

我们首先想到的是响应WM_KEYDOWN消息,但实际运行却发现没有任何效果。   
原因是对话框里的控件需要首先对按键作出响应,比如多行编辑框必须首先处理回车,不至于回车使对话框关闭。   
我们要想在第一时间对对话框的按键做出响应,需要重载PreTranslateMessage,   
以下的代码实现了在对话框中显示虚拟键值(virtual-key   code)   
  BOOL   CTestDlg::PreTranslateMessage(MSG*   pMsg)     
  {     
  if(pMsg->message == WM_KEYDOWN)     
  {     
  ///或者直接调用OnKeyDown     
  CString   strwParam;     
  strwParam.Format("%d   ",pMsg->wParam);     
  CDC*   pDC   =   GetDC();     
  pDC->TextOut(10,10,strwParam);     
  ReleaseDC(pDC);     
  }     
  return   CDialog::PreTranslateMessage(pMsg);     
  }   
    
  但要注意,如果你不想在你处理完后继续让Dialog处理,你就需要在你的case中return TRUE;
  如果在函数中要实现弹出对话框,还可以用消息来处理。
  建议你写一个函数处理如下:     
  BOOL   CMyDialog::PreTranslateMessage(MSG*   pMsg)   
  {   
          if   (IsMyKeyMessage(pMsg))   
                  return   TRUE;   
    
          return   CDialog::PreTranslateMessage(pMsg);   
  }       
  BOOL   CMyDialog::IsMyKeyMessage(MSG*   pMsg)   
  {   
          switch(pMsg->message)   
          {   
          case   WM_KEYUP:   
                  ...   
                  return   TRUE;   
          case   WM_KEYDOWN:   
                  ...   
                  return   TRUE;   
          }   
          return   FALSE;   
  }   
在MFC方式中-> CDlgDlg::PreTranslateMessage() 可接收到对话框的键盘消息.   
在API方式中-> SetWindowsHookEx() 可接收到对话框的键盘消息. 
注:有人说可以响应这个消息函数 OnGetDlgCode 然后在里面写  return DLGC_WANTALLKEYS。没有试过。
posted @ 2012-09-11 19:15  mzchine  阅读(242)  评论(0)    收藏  举报