2013-09-16 22 views
1

我使用主循環代碼(我的功能):如何截獲的消息: 「WM_QUIT || WM_DESTROY || WM_CLOSE」 WinAPI的

while (running) 
{ 
    if(is_close) 
    { 
     Log().push_log("close", "message close!", logInfo); 
     running = active = false; 

     break; 
    } 

    while (PeekMessage(&msg, g_hWnd, 0, 0, PM_REMOVE)) 
    { 
     std::cout << "Wnd: " << msg.message << std::endl; 

     if (msg.message == WM_QUIT || msg.message == WM_DESTROY || msg.message == WM_CLOSE) 
     { 
      MessageBox(0, "Hello, World", "Hello", MB_OK); 
      running = false; 
     } 
     // TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    if (running && active) 
     render.DrawObject(g_hDC); 
} 

好吧,那麼我使用的WndProc:

LRESULT CALLBACK GLWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    std::cout << "Wnd Proc: " << msg << std::endl; 

    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

當我試圖在我的函數中獲取消息WM_QUITWM_DESTROYWM_CLOSE時,它不起作用。我的功能沒有看到消息。

我怎樣才能得到這個信息?

+0

您在調用「PeekMessage」時正在應用過濾器('g_hWnd')。除非您有非常特殊的需求,否則不要過濾消息。改爲傳遞'NULL'。 – IInspectable

+0

謝謝。沒有幫助。 – KostyaKulakov

+2

您將提供具體信息。什麼是*「我的功能」*? *「不起作用」*是什麼意思?你有錯誤嗎?與您預期的結果不同?你期望什麼? – IInspectable

回答

9

PeekMessage或GetMessage將只返回使用PostMessage()發送到消息隊列的消息。這將永遠不會是WM_CLOSE或WM_DESTROY,這些消息與SendMessage()一起發送,直接傳遞給窗口過程,並且不會進入消息隊列。除非在代碼中有PostQuitMessage()調用,否則不會得到WM_QUIT。

你真的必須爲你的主窗口編寫一個窗口過程。簡單地處理WM_DESTROY並調用PostQuitMessage(0)應該足夠了。

LRESULT CALLBACK GLWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    if (msg == WM_DESTROY) PostQuitMessage(0); 
    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

您現在將在遊戲循環中獲得WM_QUIT。

+0

非常感謝!作品! – KostyaKulakov