用VC新建一个MFC的基于Dialog的应用程序,想监听键盘事件,在classwizard中
添加了WM_KEYDOWN的事件处理函数OnKeyDown,代码如下:void CTestonkeydownDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
// TODO: Add your message handler code here and/or call default

         ::AfxMessageBox("监听成功");
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);}为什么运行时候按了键盘上的键这个函数并没有被调用???

解决方案 »

  1.   

    添加此函数“PreTranslateMessage”,在这个函数中处理
      

  2.   


    BOOL CMainQueryDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if(pMsg->message == WM_KEYDOWN)
        {
            switch(pMsg->wParam)
            {
            case VK_RETURN: //回车键
                return TRUE;

    case VK_ESCAPE: //ESC键
        return TRUE;
    }
        }        

    return CDialog::PreTranslateMessage(pMsg);
    }
      

  3.   

    因为焦点可能在子窗口上(比如按钮或编辑框)比较保险的方法是重载PreTranslateMessage
    ...
    CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd);
    if(pMsg->hwnd==m_hWnd||(pWnd && pWnd->GetParent()==this) && pMsg->message==WM_KEYDOWN)
    {
       AfxMessageBox("监听成功");
    }
    ...