使用关闭按钮终止应用程序和从任务管理器结束进程有什么区别?
我知道点击关闭按钮WM_CLOSE
会在消息队列中发布一条消息,但我不知道当我们从任务管理器(或任何类似的应用程序,如 Killbox 或 Process Explorer)中终止进程时会发生什么。
使用关闭按钮终止应用程序和从任务管理器结束进程有什么区别?
我知道点击关闭按钮WM_CLOSE
会在消息队列中发布一条消息,但我不知道当我们从任务管理器(或任何类似的应用程序,如 Killbox 或 Process Explorer)中终止进程时会发生什么。
当您单击应用程序窗口标题栏中的“X”按钮时,会向窗口发送一条WM_CLOSE
消息。这是一个“优雅的”关闭——应用程序处理消息,处理任何必要的清理任务,如果它愿意,甚至可以拒绝关闭(通过返回零来响应消息)。WM_CLOSE
只是窗口或应用程序终止的请求;在应用程序本身调用该DestroyWindow
函数之前,窗口不会被销毁。
当您在任务管理器中按下“结束任务”按钮时,Windows 将首先尝试向应用程序(如果是 GUI 应用程序)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函数。进程不能阻止自己被终止。
如果您使用关闭按钮关闭应用程序,您可以让应用程序执行必要的关闭任务(如果有)。如果您从任务管理器中终止进程,则应用程序没有机会执行这些任务,您只需在不通知的情况下终止应用程序。