2016-02-12 55 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它的工作..非常感謝:) –