none
从任务管理关闭应用程序的疑问 RRS feed

  • 问题

  • 刚看了某同学的一个关于从任务管理器关闭程序时执行程序FormClose响应代码的问题。其中提到在任务管理器的“应用程序”栏关闭时,会执行Close响应代码;而在“进程”栏关闭时,不会执行Close响应代码。

    因此,可以想像:
    在“进程”栏关闭时,操作系统采取的操作是直接终止进程。
    在“应用程序”栏关闭时,操作系统采取的操作是向窗口发送一个Close消息(即相当于点击窗体的关闭按钮)。

    任务管理器中显示的信息可以佐证这一点:“应用程序”栏中显示的窗体标题,同一个应用程序的不同窗体在“应用程序”栏中被当作不同的任务。
    因此,可以想象,“应用程序”栏是针对窗口的,“进程”栏则是针对进程的。

    不过,我又测试了一下,发现似乎和想象中的不完全一致,测试代码如下:
    while (true)
                {
                    Application.Run(new FrmEllipse());
                    System.Threading.Thread.Sleep(1000);
                }
    根据我的猜想,此程序在执行时针对不同的关闭方式的响应应为:
    1、通过窗体的关闭按钮关闭时,当前窗口关闭,打开新窗口。
    2、通过任务管理器“应用程序栏”关闭时,与1相同。
    3、通过“进程”栏关闭时,当前窗口关闭,且不再打开新窗口。

    真实的执行结果显示,1、3如预期,2有点诡异,其结果为:
    当前窗口关闭,打开一个新窗口,稍后(约1~2秒)程序退出。

    哪位大侠能解释下么?

    2009年11月12日 2:54

答案

  • 你好!
         从任务管理器的“应用程序”标签结束,在.NET下我们拦截这个行为,而从“进程”标签结束进程,在.NET下我们无法控制!
         实际上可以参考一些安全软件的做法来防止结束进程!
    周雪峰
    2009年11月12日 4:28
    版主