【问题标题】:Listening to keyboard events in MFC within PreTranslateMessage()在 PreTranslateMessage() 中监听 MFC 中的键盘事件
【发布时间】:2016-02-12 12:46:55
【问题描述】:

我试图使用以下代码在基于对话框的应用程序中侦听简单的键盘事件,但按下这些键时没有任何反应。谁能告诉我出了什么问题?

BOOL PreTranslateMessage(MSG *pMsg)
{

CListeningApp* App = (CListeningApp*) AfxGetApp();
int x=(int)pMsg->wParam;

if(pMsg->message==WM_KEYDOWN)
{
    if(x==VK_UP)
    MessageBox(NULL,L"UP",L"UP", MB_OK);

    if(x==VK_DOWN)
    MessageBox(NULL,L"DOWN",L"DOWN", MB_OK);

    if(x==VK_RIGHT)
    MessageBox(NULL,L"RIGHT",L"RIGHT", MB_OK);

    if(x==VK_LEFT)
    MessageBox(NULL,L"LEFT",L"LEFT", MB_OK);

    if(x==65)
        MessageBox(NULL,L"Keyboard Event",L"You Pressed the letter a", MB_OK);


}
return TRUE;

}

【问题讨论】:

  • 因为没有人打电话给PreTranslateMessage。你的 PreTranslateMessage 只是一个独立的功能。您可以将PreTranslateMessage 重命名为foobar,结果是一样的。阅读this
  • 只是一个建议:永远不要使用MessageBox() 调试任何东西,尤其是键盘事件处理程序。使用::OutputDebugString() 并在调试器的输出窗口中观察它。
  • @VladFeinstein 它在这里用于测试目的,但你说得对,OutputDebugString 更好。
  • 那么你就在正确的轨道上。请参阅 Michael Walz 的回答,确保调用基类:return CDialog::PreTranslateMessage(pMsg);,否则它会崩溃。只有你处理了消息,然后TRUE表示你自己处理了消息。
  • 链接错误来自其他原因。正确阅读完整的链接错误,它应该说明它是什么。如有必要,重建项目。

标签: c++ visual-studio visual-c++ mfc


【解决方案1】:

您的PreTranslateMessage 函数是一个独立函数。它不会因为它的名字是PreTranslateMessage而被自动调用。

该函数必须是您的对话框类的成员。

BOOL CYourDlg::PreTranslateMessage(MSG* pMsg)
{
...
}

CYourDlg你的 对话框类。

在你的对话框类 CYourDlg 的声明中的某处:

virtual BOOL PreTranslateMessage(MSG* pMsg);

【讨论】:

  • 确实如此。你只是忘了提到在PreTranslateMessage 中这样做没有什么意义。相反,只需覆盖OnKeyDown
  • 也调用基类return CDialog::PreTranslateMessage(pMsg);
猜你喜欢
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 2018-04-15
  • 2015-08-14
相关资源
最近更新 更多