关闭应用程序和从任务管理器结束进程有什么区别?

时间:2012-05-26 09:49:22

标签: windows process taskmanager

使用关闭按钮终止应用程序和从任务管理器结束进程有什么区别?

我知道按下关闭按钮会在消息队列中发布WM_CLOSE消息,但我不知道当我们从任务管理器(或任何类似的应用程序,如Killbox)中删除进程时会发生什么或Process Explorer)。

3 个答案:

答案 0 :(得分:7)

当您单击应用程序窗口标题栏中的“X”按钮时,会向窗口发送WM_CLOSE message。这是一个“优雅”的关闭 - 应用程序处理消息,处理任何必要的清理任务,甚至可以拒绝关闭,如果它需要(通过返回零响应消息)。 WM_CLOSE只是窗口或应用程序终止的请求;在应用程序本身调用DestroyWindow function之前,窗口不会被销毁。

当您在任务管理器中按“结束任务”按钮时,Windows将首先尝试发送应用程序(如果它是GUI应用程序)WM_CLOSE消息。换句话说,它首先要求很好,并让应用程序有机会彻底终止。 *

如果您未能关闭该初始WM_CLOSE消息,则任务管理器将通过调用TerminateProcess function进行跟进。这个函数有点不同,因为强制终止应用程序的进程及其所有线程,而不需要应用程序的许可。这是一种非常苛刻的关闭方法,应该用作最后的手段 - 例如当应用程序挂起并且不再响应消息时。

TerminateProcess是一个非常低级的函数,它基本上从内存中撕掉了进程的用户模式部分,迫使它无条件地终止。调用TerminateProcess可以绕过诸如关闭​​通知和DLL_PROCESS_DETACH之类的细节。您的应用程序无法拒绝关闭,并且无法捕获/捕获/挂钩对TerminateProcess的调用。此过程中的所有用户模式代码都会停止运行。这是一个非常不洁的关闭程序,有点类似于将计算机的电源插头从墙上拉出来。

* 请注意,只有在使用“任务管理器”的“应用程序”选项卡终止应用程序时才会出现这种情况。如果使用“进程”选项卡,则跳过此步骤并立即调用TerminateProcess函数。这种区别反映在各个按钮的标题上。对于“应用程序”选项卡,按钮是标题为“结束任务”;对于“进程”选项卡,该按钮标记为“结束进程”。

答案 1 :(得分:4)

使用WM_CLOSE杀死进程只会向进程发送消息,并允许目标处理消息并正常退出。或者,该流程可以选择不退出其WM_CLOSE处理程序。

通过任务管理器杀死进程将使用更加严厉的终结进程:

  

TerminateProcess 函数用于无条件地导致a   退出的过程。动态链接维护的全局数据状态   如果使用 TerminateProcess ,则库(DLL)可能会受到损害   比 ExitProcess

     

此函数停止执行其中的所有线程   该过程并请求取消所有挂起的I / O.该   终止进程无法退出,直到所有挂起的I / O都已执行   完成或取消。当进程终止时,它的内核对象是   直到所有具有打开句柄的进程才被销毁   进程释放了这些句柄。

     

TerminateProcess 是异步的;   它启动终止并立即返回。如果你需要   确保进程已终止,调用 WaitForSingleObject 函数   掌握过程。一个过程不能阻止自己   被终止。

答案 2 :(得分:3)

如果使用关闭按钮关闭应用程序,则允许应用程序执行必要的关闭任务(如果有)。如果您从任务管理器中终止进程,则应用程序无法执行这些任务,您只需终止应用程序而不通知。