C Win32消息循环:在窗口关闭后使用GetMessage(&;msg,NULL,0,0)退出?
如果我有下面的代码,如何检测窗口何时关闭,以便退出C Win32消息循环:在窗口关闭后使用GetMessage(&;msg,NULL,0,0)退出?,c,winapi,window,message-loop,C,Winapi,Window,Message Loop,如果我有下面的代码,如何检测窗口何时关闭,以便退出r似乎从未获得值-10,我需要处理整个线程的消息,而不仅仅是当前窗口 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; BOO
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);
}
等待
r=-1
不是检测窗口已关闭的方式。返回值-1不是正常情况:它表示消息循环中发生了错误
从:
返回值
类型:BOOL
如果函数检索的消息不是WM_QUIT
,则返回值为非零
如果函数检索WM_QUIT
消息,则返回值为零
如果存在错误,则返回值为-1。例如,如果hWnd是无效的窗口句柄或lpMsg
是无效的指针,则函数将失败。要获取扩展错误信息,请调用GetLastError
当GetMessage
从队列中检索WM_QUIT
消息时,它将返回值0,您应该结束循环
如果您只想知道窗口何时关闭,您可能需要处理或消息。有关这些消息的讨论,请参阅此问题的答案:我找到了解决方案:。
消息循环可以独立于
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
消息而不暂停(第一次提示),并可以检查窗口(确认)。对不起,我完全忘记了r==-1
不是关闭状态。但它不也应该以r==0退出吗?为什么它不这么做?(顺便说一句,我的WM_QUIT
从未发送到循环。)@Mehrdad:是的,我的回答指出WM_QUIT
从未发送到消息循环。如果GetMessage
检索WM\u QUIT
,则返回值0。想必,问题是您从未发送WM\u QUIT
消息。当窗口关闭时,您需要处理该情况,并使用指示循环应该退出。哦,等等。。。因此,如果我需要发送它,并且我打开了多个窗口,每个窗口中都有许多控件,那么我如何知道我是否是最后一个打开的窗口,以及我是否应该从WndProc发送它?跟踪它不是变得很难看吗?@Mehrdad:大多数应用程序都有一个“主”窗口,当它关闭时会退出程序,而不管其他窗口是打开的。如果您确实有对等窗口,只需在全局变量中保留count。