c/c++语言开发共享Win32消息循环:使用GetMessage(&msg,NULL,0,0)关闭窗口后退出?

如果我在下面有以下代码,如何检测窗口何时关闭,以便我可以退出? 似乎永远不会得到值-1 0 ,我需要处理整个线程的消息,而不仅仅是当前窗口。

 HWND hWnd = CreateWindowExW(0, L"Edit", L"My Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, NULL, NULL); ShowWindow(hWnd, SW_SHOWDEFAULT); MSG msg; BOOL r; while ((r = GetMessageW(&msg, NULL, 0, 0)) != 0) { if (r == -1) { break; } TranslateMessage(&msg); DispatchMessageW(&msg); } 

    等待r = -1不是您检测到窗口已关闭的方式。 返回值-1不是正常情况:它表示消息循环中发生了错误。

    从文档 :

    回报价值

    类型: BOOL

    如果函数检索WM_QUIT以外的消息,则返回值为非零。

    如果函数检索WM_QUIT消息,则返回值为零。

    如果有错误,则返回值为-1。 例如,如果hWnd是无效的窗口句柄或lpMsg是无效指针,则函数将失败。 要获取扩展错误信息,请调用GetLastError

    GetMessage从队列中检索WM_QUIT消息时,它将返回值0,您应该结束循环。

    如果您只想知道窗口何时关闭,您可能想要处理WM_CLOSEWM_DESTROY消息。 有关这些消息的讨论,请参阅此问题的答案: Windows程序中WM_QUIT,WM_CLOSE和WM_DESTROY之间的区别是什么?

    我找到了一个解决方案: WM_NULL
    消息循环可以独立于WndProc自行处理问题:

     // written in C# MSG msg = new MSG(); while (GetMessage(out msg, window, 0, 0)) { if ((msg.message == WM_NULL) && !IsWindow(window)) break; TranslateMessage(ref msg); DispatchMessage(ref msg); } Console.WriteLine("yeah, out of loop ^^"); 

    从我的观察:当窗口被销毁时, GetMessage无需暂停(第一个提示)检索WM_NULL消息, IsWindow可以检查窗口(肯定)。

      以上就是c/c++开发分享Win32消息循环:使用GetMessage(&msg,NULL,0,0)关闭窗口后退出?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/550084.html

      (1)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐