2013-09-16 24 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