Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Win32消息循环:在窗口关闭后使用GetMessage(&;msg,NULL,0,0)退出?_C_Winapi_Window_Message Loop - Fatal编程技术网

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。