none
关于WinForm的窗口关闭的一个问题,求教··· RRS feed

  • 问题

  • 一个WinForm窗体,private void Form1_FormClosing(object sender, FormClosingEventArgs e) 窗体的这个事件执行它的关闭, 想问的是,如果我是用Windows任务管理器直接关掉应用程序,或者进程。我如果能够执行此事件(FormClosing)里的代码呢???有什么好的方法吗?
    2009年11月11日 13:09

答案

  • 直接在FormClosing事件中也可以拦截:
            private void form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (e.CloseReason ==CloseReason.TaskManagerClosing)
                    MessageBox.Show("asdf");
            }
    周雪峰
    • 已标记为答案 天驰 2011年1月18日 8:41
    2009年11月11日 17:36
    版主
  • 请问有用C#写的实例吗???
    单纯使用C#无法实现Hook!

    周雪峰

    对的,其实我贴的那个链接里也说明了这个问题,呵呵!
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 天驰 2011年1月18日 8:40
    2009年11月12日 10:32
  • 你好!
         可以尝试这个方法:
            protected override void OnFormClosing(FormClosingEventArgs e)
            {
                switch (e.CloseReason)
                {
                    
                    if(e.CloseReason==CloseReason.TaskManagerClosing)
                        //执行自己的代码
                        
    
                base.OnFormClosing(e);
            }
    

    周雪峰
    • 已标记为答案 天驰 2011年1月18日 8:40
    2009年11月11日 17:28
    版主
  • 在private void form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (e.CloseReason ==CloseReason.TaskManagerClosing)
                    MessageBox.Show("asdf");
            }

    如果是在任务管理器的应用程序里关闭的话,其有效··如果是在进程里关的话,无效·

    我想要的进程里进行关,谢谢


    有一句俗语叫什么来着? 临时抱佛脚.事情不是这么做的.

    你应该使用SL大法,而不是事到临头再补救.

    当然,临时抱佛脚的办法也不是没有,你可以使用Hook拦截进程关闭的消息.
    我不知道你的应用复杂到什么程序而必须使用重量级的Hook.
    • 已标记为答案 YiChun Chen 2009年11月13日 2:58
    2009年11月12日 2:58
  • 这个需要使用钩子来拦截TerminateProcess,具体可以参考:
    http://download.csdn.net/source/196801
    周雪峰
    • 已标记为答案 YiChun Chen 2009年11月13日 2:58
    2009年11月12日 4:37
    版主
  • 你好!

    你是想要用HOOK和API来阻止你的程序被关闭的话,可以参考一下这个帖子:
    http://topic.csdn.net/t/20051123/23/4414149.html

    希望对你有所帮助。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 YiChun Chen 2009年11月13日 2:58
    2009年11月12日 9:13
  • 请问有用C#写的实例吗???
    单纯使用C#无法实现Hook!

    周雪峰
    • 已标记为答案 天驰 2009年11月13日 2:09
    2009年11月12日 10:21
    版主

全部回复

  • 你好!

    任务管理器关闭进程是不会执行 FormClosing 事件的。C# 没有直接提供这样的功能。

    知识改变命运,奋斗成就人生!
    2009年11月11日 15:40
    版主
  • 你好!
         可以尝试这个方法:
            protected override void OnFormClosing(FormClosingEventArgs e)
            {
                switch (e.CloseReason)
                {
                    
                    if(e.CloseReason==CloseReason.TaskManagerClosing)
                        //执行自己的代码
                        
    
                base.OnFormClosing(e);
            }
    

    周雪峰
    • 已标记为答案 天驰 2011年1月18日 8:40
    2009年11月11日 17:28
    版主
  • 直接在FormClosing事件中也可以拦截:
            private void form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (e.CloseReason ==CloseReason.TaskManagerClosing)
                    MessageBox.Show("asdf");
            }
    周雪峰
    • 已标记为答案 天驰 2011年1月18日 8:41
    2009年11月11日 17:36
    版主
  • 在任务管理器的进程页关闭程序的话不会执行被终止的程序的代码。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年11月11日 19:18
    版主
  • 那么请问下有没有类似的解决方案能够解决这个问题呢?
    即在任务管理器的进程页关闭程序的话,还执行一次程序的代码?

    2009年11月12日 1:25
  • 在private void form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (e.CloseReason ==CloseReason.TaskManagerClosing)
                    MessageBox.Show("asdf");
            }

    如果是在任务管理器的应用程序里关闭的话,其有效··如果是在进程里关的话,无效·

    我想要的进程里进行关,谢谢

    2009年11月12日 1:29
  • 在private void form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (e.CloseReason ==CloseReason.TaskManagerClosing)
                    MessageBox.Show("asdf");
            }

    如果是在任务管理器的应用程序里关闭的话,其有效··如果是在进程里关的话,无效·

    我想要的进程里进行关,谢谢


    有一句俗语叫什么来着? 临时抱佛脚.事情不是这么做的.

    你应该使用SL大法,而不是事到临头再补救.

    当然,临时抱佛脚的办法也不是没有,你可以使用Hook拦截进程关闭的消息.
    我不知道你的应用复杂到什么程序而必须使用重量级的Hook.
    • 已标记为答案 YiChun Chen 2009年11月13日 2:58
    2009年11月12日 2:58
  • SL大法???什么东东

    试试
    2009年11月12日 3:06
  • SL大法???什么东东

    试试

    Save/Load
    2009年11月12日 3:16
  • 不懂···什么意思。


    我这是自己写的试验的实例,昨天看 Session过期的时候突然想到的,如果想实现WinForm需要怎么样的代码解决方案,

    这貌似不是临时抱佛脚,我这貌似是属于烧香的呵呵···

    HOOK怎么用···有什么系统点的文档吗?

    2009年11月12日 4:03
  • 这个需要使用钩子来拦截TerminateProcess,具体可以参考:
    http://download.csdn.net/source/196801
    周雪峰
    • 已标记为答案 YiChun Chen 2009年11月13日 2:58
    2009年11月12日 4:37
    版主
  • 请问有用C#写的实例吗???
    2009年11月12日 8:10
  • 你好!

    你是想要用HOOK和API来阻止你的程序被关闭的话,可以参考一下这个帖子:
    http://topic.csdn.net/t/20051123/23/4414149.html

    希望对你有所帮助。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 YiChun Chen 2009年11月13日 2:58
    2009年11月12日 9:13
  • 请问有用C#写的实例吗???
    单纯使用C#无法实现Hook!

    周雪峰
    • 已标记为答案 天驰 2009年11月13日 2:09
    2009年11月12日 10:21
    版主
  • 请问有用C#写的实例吗???
    单纯使用C#无法实现Hook!

    周雪峰

    对的,其实我贴的那个链接里也说明了这个问题,呵呵!
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 天驰 2011年1月18日 8:40
    2009年11月12日 10:32