2013-03-28 70 views
0

我沒有規範的消息循環運行,所以有沒有辦法可以在我的消息處理程序中調用TranslateMessage(或其等價物)?我可以在消息回調中調用TranslateMessage嗎?

基本上我需要WM_CHAR消息,除非我可以調用TranslateMessage我不會去那些。目前我有消息proc設置,但沒有消息循環。

// Static window function called by Windows for message processing. Implementation 
// delegates message processing to MemberWndProc. 
LRESULT CALLBACK FxPlayerTiny::WindowsMsgStatic(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) 
{ 

     msg = PeekMessage(&msg, HWnd, WM_KEYFIRST, WM_KEYLAST, PM_NOREMOVE); 

     if (msg type is key down){ 

      TranslateMessage(&msg); 
      //DispatchMessage(&msg); -- needed? 

     } 
     else process msg normally 
} 

我的消息PROC處理器是信息的條目的第一點,是建立在以下方式:

WNDCLASSEX wc; 
wc.lpfnWndProc = WindowsMsgStatic; 
.... 
RegisterClassEx(&wc); 

回答

1

在某些時候,爲了得到一個排隊的消息,則必須調用功能如GetMessagePeekMessage。這些函數產生的對象爲MSG,這些對象必須傳遞到TranslateMessageDispatchMessage

在問題的原始版本的代碼中,您試圖調用TranslateMessageDispatchMessage來不及。你可以在你的窗口過程中調用它們。您應該在第一次收到MSG對象的位置打電話給他們。換句話說,在致電PeekMessageGetMessage之後直接致電TranslateMessageDispatchMessage

+0

您的代碼編輯現在讓我的答案看起來很傻。我真的不想重複寫一遍又一遍。關於'WM_CHAR',它們通過'TranslateMessage'發佈到窗口。你的問題的問題是,你只是提出了一個小問題的窗口。所以我們可以解決這個小小的窗口,但是然後你發現潛在的問題還沒有完全解決。然後你再把窗戶打開並改變我們的視野。你應該告訴我們一切! –

+0

這就是我所擁有的!我再也沒有處理消息循環的代碼了! –

+0

但我們沒有看到大圖。我可以說,你在窗口過程中抽取隊列是不對的。 –

相關問題