closures应用程序和结束从任务pipe理器的过程有什么区别?

使用closuresbutton查杀应用程序和从任务pipe理器结束进程之间有什么区别?

我知道点击closuresbutton在消息队列中发送WM_CLOSE消息的事实,但我不知道当我们从任务pipe理器(或任何类似的应用程序,如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函数,并使用该进程的句柄。 一个进程不能阻止自己被终止。

如果使用关闭按钮关闭应用程序,则让应用程序执行必要的关闭任务(如果有)。 如果从任务管理器中终止一个进程,那么应用程序就没有机会执行这些任务,您只需在不通知的情况下终止该应用程序。