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

标签 windows process taskmanager

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

我知道点击关闭按钮会在消息队列中发送一条 WM_CLOSE 消息,但我不知道当我们从任务管理器(或任何类似的Killbox 或 Process Explorer 等应用程序)。

最佳答案

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

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

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

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

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

关于windows - 关闭应用程序和从任务管理器结束进程有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10765197/

相关文章:

java - 如何从任务管理器进程列表中的进程列表中区分不同的JavaWS应用程序?

c - 完全禁用任务管理器的 Win32 API 是什么?

windows - 确定事件窗口名称或 ID

c++ - 为什么打印字符串时得到的是十六进制值?

windows - Bat 文件仅生成文件的 MD5 校验和

linux - 用户线程和内核线程如何与 Linux 堆栈一起工作?

c++ - 使 system() 产生的子进程在父进程收到终止信号并退出后继续运行

c# - 如何为我的程序设置任务管理器描述?

c++ - 相当于 Linux 中的导入库

python - 如何让Python自动允许端口通过Windows防火墙