1

如果我有以下代码,如何检测窗口何时关闭,以便退出?r似乎从来没有得到值,我需要为整个线程处理消息,而不仅仅是当前窗口。-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);
}
4

2 回答 2

3

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

文档中:

返回值

类型:BOOL

如果函数检索到的消息不是WM_QUIT,则返回值非零。

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

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

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

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

于 2011-02-04T00:34:13.707 回答
0

我为此找到了解决方案: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_NULLIsWindow

于 2014-07-08T12:21:12.040 回答