c++ - 为什么 OnKeyDown 不捕获基于对话框的 MFC 项目中的按键事件?

标签 c++ visual-c++ mfc keydown dialogbasedapp

我只是在 MFC (VS2008) 中创建了一个基于对话框的项目,并将 OnKeyDown 事件添加到对话框中。 当我运行项目并按下键盘上的键时,没有任何反应。但是,如果我从对话框中删除所有控件并重新运行项目,它就会工作。 即使我在对话框上有控件,我应该怎么做才能获得关键事件?

这是一段代码:

void CgDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
    AfxMessageBox(L"Key down!");
    CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

最佳答案

当对话框上有控件时,对话框本身永远不会获得焦点。它被子控件偷走了。当您按下按钮时,WM_KEYDOWN 消息将发送到具有焦点的控件,因此您的 CgDlg::OnKeyDown 永远不会被调用。如果您希望对话框处理 WM_KEYDOWN 消息,请覆盖对话框的 PreTranslateMessage 函数:

BOOL CgDlg::PreTranslateMessage(MSG* pMsg)
{
   if(pMsg->message == WM_KEYDOWN   )  
   {
      if(pMsg->wParam == VK_DOWN)
      {
         ...
      }
      else if(pMsg->wParam == ...)
      {
         ...                      
      }
      ...
      else
      {
         ...                   
      }
   }

   return CDialog::PreTranslateMessage(pMsg);  
}

另请参阅有关 CodeProject 的这篇文章:http://www.codeproject.com/KB/dialog/pretransdialog01.aspx

关于c++ - 为什么 OnKeyDown 不捕获基于对话框的 MFC 项目中的按键事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4699148/

相关文章:

c++ - 当我在基类中设置 protected 数据时,它会更改派生类中 protected 数据的值吗?

mfc - 如何获取pendrive的盘符

c++ - 如何在 C++ 中扩展 listControl 类并添加新功能?

c++ - 使用 STL vector 连续分配对象

c++ - 是否可以将指针视为非类型模板参数中的整数类型?

c++ - bash:无法执行二进制文件:Exec 格式错误,即使二进制文件和 Linux 是 64 位的

c++ - MFC C++ - 在没有命令的情况下在 ProcessShellCommand() 上崩溃

visual-c++ - 如何检查从 VC++ 生成的二进制 exe 的运行时库类型

c++结构数组 - "This declaration has no storage class or type specifier"

c++ - GL_TEXTURE_3D 是什么意思?