Windows 任务管理器结束程序时的不明确行为

Windows 任务管理器结束程序时的不明确行为,windows,winapi,visual-c++,taskmanager,Windows,Winapi,Visual C++,Taskmanager,我使用WINAPI制作了一个简单的Windows应用程序,然后在其WinProc中处理WM_CLOSE,以显示一个消息框,请求用户确认或取消关闭窗口 当简单地单击交叉按钮时,应用程序工作正常,但从TaskManager结束应用程序时,模型和非模型消息框显示不同的行为 在使用模型消息框时,只有一个消息框弹出供用户确认,但在使用非模型消息框时,会弹出两个消息框 为什么它会显示两个对话框 这是我的密码 case WM_CLOSE: if (MessageBox(NULL, "Do you want

我使用WINAPI制作了一个简单的Windows应用程序,然后在其WinProc中处理WM_CLOSE,以显示一个消息框,请求用户确认或取消关闭窗口

当简单地单击交叉按钮时,应用程序工作正常,但从TaskManager结束应用程序时,模型和非模型消息框显示不同的行为

在使用模型消息框时,只有一个消息框弹出供用户确认,但在使用非模型消息框时,会弹出两个消息框

为什么它会显示两个对话框

这是我的密码

case WM_CLOSE:
  if (MessageBox(NULL, "Do you want to quit","Exit",MB_OKCANCEL|MB_ICONQUESTION) == IDOK)
    PostQuitMessage (WM_QUIT);
  else
    ShowWindow (hWnd, SW_RESTORE);
  break;
完整的代码可以在


由于该对话框是非模态的,任务管理器将尝试关闭消息框和主窗口。你的代码错了。如果用户点击X两次,您的应用程序崩溃。@Raymond如果用户多次单击X,则会弹出多个消息框,而不是应用程序崩溃。关于您的第一次辩论,如果打开了4个消息框,则在通过任务管理器结束程序时,会出现另外5个消息框,而不是用户多次单击X时的情况次数并获取多个消息框,请尝试按错误的顺序取消消息框。(您甚至可能没有注意到当前代码的问题,特别是因为它只是发布了一条退出消息,而没有进行适当的清理。但是一个进行适当清理的更复杂的程序会注意到。)@RaymondChen说,如果我打开k个消息框,然后在k-1个消息框上按ok或cancel,则什么都不会发生。仅当最后一个消息框提供了输入(说cancel)任何一个k-1被提供,一个ok输入应用程序关闭。如果k-1被提供取消,并且只有最后一个被提供ok,那么应用程序也关闭您不会注意到当前代码中的问题,因为您没有
WM\u DESTROY
处理程序。由于对话框是非模态的,任务管理器尝试同时关闭消息框和主窗口。你的代码错了。如果用户点击X两次,您的应用程序崩溃。@Raymond如果用户多次单击X,则会弹出多个消息框,而不是应用程序崩溃。关于您的第一次辩论,如果打开了4个消息框,则在通过任务管理器结束程序时,会出现另外5个消息框,而不是用户多次单击X时的情况次数并获取多个消息框,请尝试按错误的顺序取消消息框。(您甚至可能没有注意到当前代码的问题,特别是因为它只是发布了一条退出消息,而没有进行适当的清理。但是一个进行适当清理的更复杂的程序会注意到。)@RaymondChen说,如果我打开k个消息框,然后在k-1个消息框上按ok或cancel,则什么都不会发生。仅当最后一个消息框提供了输入(说cancel)任何一个k-1被提供,一个ok输入应用程序关闭。如果k-1被提供取消,并且只有最后一个被提供ok,那么应用程序也关闭您不会注意到当前代码中的问题,因为您没有
WM\u DESTROY
处理程序。