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

Posted

技术标签:

【中文标题】关闭应用程序和从任务管理器结束进程有啥区别?【英文标题】:What is the difference between closing an application and ending the process from Task Manager?关闭应用程序和从任务管理器结束进程有什么区别? 【发布时间】:2012-05-26 09:49:21 【问题描述】:

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

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

【问题讨论】:

你通常会杀死一个进程而不是一个应用程序 【参考方案1】:

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

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

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

TerminateProcess 是一个非常低级的函数,它本质上是从内存中删除进程的用户模式部分,强制它无条件终止。调用TerminateProcess 会绕过关闭通知和DLL_PROCESS_DETACH 等细节。您的应用程序没有拒绝关闭的能力,也无法捕获/捕获/挂钩对TerminateProcess 的调用。进程中的所有用户模式代码都将永远停止运行。这是一个非常不干净的关机程序,有点类似于将计算机的电源插头从墙上拔下来。

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

【讨论】:

我正在尝试创建同一程序的另一个实例(分离进程),同时使用 CreateProcess 处理 WM_CLOSE 消息,以便程序自行重新启动,但它似乎没有发生.. @user 这与您在这里提出的问题有什么关系?并且您的评论中没有提供足够的信息来调试问题。你有什么代码?当你说“它似乎没有发生”时,你是什么意思?会发生什么? 您说“您的应用程序没有拒绝关闭的能力,并且没有办法捕获/陷阱/挂钩对 TerminateProcess 的调用”,但是如果我们不设置 @ 987654335@我们程序的访问权限??是否仍然可以使用TerminateProcess.. 终止我们的程序 @user 是的,可能,但这是权限问题。您始终可以通过使用组策略来阻止用户杀死应用程序。但是一旦用户提升并以管理员身份运行任务管理器,他们就可以为所欲为。 @Cody:我认为你有一个错字,但我不知道是哪条路。你的意思是说 TerminateProcess 是同步的,还是在进程完全终止之前返回给调用者?【参考方案2】:

使用WM_CLOSE 杀死进程只是用消息向进程发出信号,并允许目标处理消息并优雅地退出。或者,该进程可以选择不在其WM_CLOSE 处理程序中退出。

通过任务管理器杀死进程将使用更苛刻的 TerminateProcess 来完成:

TerminateProcess 函数用于无条件地导致 退出的过程。动态链接维护的全局数据状态 如果使用 TerminateProcess 而不是 比退出进程

这个函数停止执行所有线程 进程并请求取消所有挂起的 I/O。这 在所有待处理的 I/O 完成之前,终止的进程无法退出 完成或取消。当一个进程终止时,它的内核对象是 直到所有具有打开句柄的进程才被销毁 进程已释放这些句柄。

TerminateProcess 是异步的; 它启动终止并立即返回。如果你需要 确定进程已终止,调用 WaitForSingleObject 函数 带有处理过程的句柄。进程不能阻止自己 被终止。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于关闭应用程序和从任务管理器结束进程有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何让delphi任务管理器失效,让程序无法关闭??

任务管理器里都有哪些任务是必须的,哪些可以关掉,每个任务具体的用途

进程资源管理器和任务管理器之间的区别[关闭]

关于任务管理器中的进程

电脑怎么关闭进程?

怎样在电脑结束进程?