2016-02-12 56 views
0

我试图使用以下代码来侦听基于对话框的应用程序中的简单键盘事件,但按下这些键时没有任何事情发生。有人可以告诉我哪里出了问题?在PreTranslateMessage中监听MFC中的键盘事件

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; 

} 
+0

因为没有人叫'PreTranslateMessage'。你的'PreTranslateMessage'只是一个独立的函数。你可以将'PreTranslateMessage'重命名为'foobar',结果是一样的。阅读[this](https://msdn.microsoft.com/library/kkbhxcs2.aspx)。 –

+1

只是一个建议:永远不要用'MessageBox()'调试任何东西,特别是不要使用键盘事件处理程序。使用':: OutputDebugString()'并在调试器的Output窗口中观察它。 –

+0

@VladFeinstein它在这里用于测试目的,但你是正确的'OutputDebugString'更好。 –

回答

2

您的PreTranslateMessage功能是一个独立的功能。它不会被自动调用,因为它的名字是PreTranslateMessage

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

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

CYourDlg作为对话框类。

而且在对话框类CYourDlg看跌期权的申报地方:

virtual BOOL PreTranslateMessage(MSG* pMsg); 
+0

够正确。你只是忘了提及在PreTranslateMessage中做这件事没有多大意义。相反,只需重写'OnKeyDown'。 –

+1

也调用基类'返回CDialog :: PreTranslateMessage(pMsg);' –

+0

@MichaelWalz它的工作..非常感谢:) –