使用关闭按钮和从任务管理器结束进程有什么区别?
我知道使用关闭按钮会在消息队列中发布一个WM_CLOSE消息,但我不知道当我们从任务管理器(或类似的应用程序如Killbox或Process Explorer)结束进程时会发生什么。
我知道使用关闭按钮会在消息队列中发布一个WM_CLOSE消息,但我不知道当我们从任务管理器(或类似的应用程序如Killbox或Process Explorer)结束进程时会发生什么。
WM_CLOSE
消息。这是一种“优雅”的关闭方式 - 应用程序处理消息,处理任何必要的清理任务,并且如果希望不关闭(通过响应消息返回零)甚至可以拒绝关闭。 WM_CLOSE
只是一个请求,窗口或应用程序终止;窗口直到应用程序本身调用DestroyWindow
函数才会被销毁。 WM_CLOSE 消息。换句话说,它首先礼貌地询问并给予应用程序终止自身的机会。*
如果您未能在响应最初的WM_CLOSE
消息时关闭,任务管理器将通过调用TerminateProcess
函数进行跟进。该函数有点不同,因为它强制性地终止应用程序的进程和所有线程,而不需要从应用程序请求许可。这是一种非常严厉的关闭方法,应作为最后的手段使用——例如当应用程序挂起并且不再响应消息时。
TerminateProcess
是一个非常低级别的函数,它基本上从内存中剥离了进程的用户模式部分,强制终止它的运行。调用TerminateProcess
会绕过关闭通知和DLL_PROCESS_DETACH
等细节。您的应用程序无法拒绝关闭,并且没有办法捕获/陷阱/钩子调用TerminateProcess
。进程中的所有用户模式代码都将永久停止运行。这是一种非常不干净的关闭过程,有点类似于突然拔掉计算机电源插头。
* 请注意,仅当您使用任务管理器的“应用程序”选项卡来终止应用程序时,此内容才正确。如果您使用“进程”选项卡,则会跳过此步骤并立即调用TerminateProcess
函数。这种区别反映在相应按钮的标题中。对于“应用程序”选项卡,按钮标签为“结束任务”; 对于“进程”选项卡,按钮标签为“结束进程”。
WM_CLOSE
来结束进程只是向该进程发送信号消息,让目标进程处理该消息并平稳退出。或者,该进程在其 WM_CLOSE
处理程序中选择不退出。TerminateProcess
方法:
TerminateProcess 函数用于无条件地导致进程退出。如果使用 TerminateProcess 而不是 ExitProcess,则可能会影响由动态链接库 (DLL) 维护的全局数据状态。
此函数停止进程内的所有线程的执行,并请求取消所有未决的 I/O 操作。终止的进程在所有未决 I/O 完成或已取消之前不能退出。当进程终止时,它的内核对象不会被销毁,直到拥有该进程打开句柄的所有进程都释放了这些句柄。
TerminateProcess 是异步的;它启动终止操作并立即返回。如果需要确保进程已终止,请使用该进程的句柄调用 WaitForSingleObject 函数。进程无法防止自身被终止。
如果您使用关闭按钮关闭应用程序,则可以让应用程序执行必要的关闭任务(如果有)。如果您从任务管理器中终止进程,则应用程序没有机会执行这些任务,而是在不通知的情况下终止应用程序。