【发布时间】: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