是什么使用的关闭按钮从任务管理器杀应用程序和结束进程之间的区别?
我知道的一个事实,即击中关闭按钮职位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
函数立即调用。 这种区别反映在各按钮的标题。 对于“应用程序”标签,该按钮被lableled“结束任务”; 对于“进程”标签,该按钮被标记为“结束进程”。
杀死与所述过程WM_CLOSE
简单地用信号通知的过程与消息和允许目标来处理消息并退出正常。 另外,这个过程可以选择不退出在WM_CLOSE
处理程序。
通过任务管理器杀死进程会这么做了TerminateProcess用这更严厉的:
TerminateProcess函数用于无条件地导致进程退出。 如果了TerminateProcess而不是使用了ExitProcess通过动态链接库(DLL)维持全局数据的状态可能会受到影响。
此功能停止进程中的所有线程的执行,并要求所有未决的I / O的取消。 终止的进程不能退出,直到所有挂起的I / O已经完成或取消。 当一个进程终止时,其内核对象不被破坏,直到有打开的句柄到进程中的所有进程已经发布这些句柄。
了TerminateProcess是异步的; 它启动终止并立即返回。 如果您需要确保该进程已经终止,调用WaitForSingleObject函数带有把手的过程。 进程不能防止自身被终止。
如果您使用的关闭按钮关闭应用程序,让你的应用程序来执行,如果必要的关闭任务。 如果你杀了从任务管理器的过程有没有机会申请到完成这些任务,你只是终止应用程序,无需通知。