c# winform中怎么截获处理windows关闭的消息
有没有个专家给条名路?

解决方案 »

  1.   

    如果是VS2005的话,可以用如下的事件,这个事件是系统关闭或注销的时候发生的:
    Microsoft.Win32.SystemEvents.SessionEnding
      

  2.   

    在窗口程序里,可以用WndProc来得到并处理Window系统注销或关闭的消息,如:protected override void WndProc(ref Message m)
    {
    if (m.Msg == 0x11)//WM_QUERYENDSESSION


    }
    else if (m.Msg == 0x16)//WM_ENDSESSION


    }
    base.WndProc(ref m);
    }
      

  3.   

    public class form1:System.Windows.Forms.Form,IMessageFilter
    {
        public bool PreFilterMessage(ref System.Windows.Forms.Message mm)
        {
           if(mm.Msg>=512&&mm.Msg<=515)
           {return true;}
           return false;
         }
    private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {

    }private void Form1_Load(object sender, System.EventArgs e)
    {
    Application.AddMessageFilter(this);
    }
    }
      

  4.   

    如果你是要在窗口點關閉時,處理事情,那就可以在Form_Closing事件中寫代碼,取消關閉執行e.Cancel = true;就可。
      

  5.   

    我的意思是,程序没有关闭,但windows要关闭,类似work抓到windows关闭的消息,提示是否要保存那样的操作,正在试验hbxtlhx(平民百姓) 和tuyile006(小y) 的方法
      

  6.   

    Form 针对关闭有两个事件:1、Closing :在关闭窗体时发生。
    2、Closed : 关闭窗体后发生。
      
    lz可以看看msdn,上面有详细解释。
      

  7.   

    hbxtlhx(平民百姓) 和tuyile006(小y) 的方法都对!
    但你并不能阻止windows 关闭
      

  8.   

    如下的代码就是了:
    protected override void WndProc(ref Message m)
    {
    if (m.Msg == 0x11)//WM_QUERYENDSESSION
    {
    m.Result = (IntPtr)0;//0不关闭程序和系统;1关闭程序及系统
    return;
    }
    else if (m.Msg == 0x16)//WM_ENDSESSION
    {
    }
    base.WndProc(ref m);
    }
    另外,可以用Closeing事件,事件里的参数e有个Cancel,当e.Cancel=true的时候也会不关闭程序及系统(或注销)
      

  9.   

    WndProc并不能截获全局消息,只能截获发送给本窗口的消息
    要想阻止windows关闭,只能使用API
      

  10.   

    TO:GXY2005(晓晨美眉好^_^) ( ) 信誉:91    Blog 
    ---------------
    要想阻止windows关闭,只能使用API?
    这句话不对吧...
      

  11.   

    平民百姓说得没错,很久以前我也回答了一位CSDN上的朋友同样的问题,以下是阻止关机的代码:
    private const int WM_QUERYENDSESSION=0x0011;
    protected override void WndProc(ref Message m)
    {
    int i=0;
    switch(m.Msg)
    {
    case WM_QUERYENDSESSION:
    m.Result=(IntPtr)i;
    break;
    default:
    base.WndProc(ref m);
    break;
    }

    }
    ---------------------------------
    当然你关了电源就没办法阻止了,不过还是可以在关机前保存数据的(在case WM_QUERYENDSESSION:处添加代码就行了)
      

  12.   

    搞定了,就是hbxtlhx(平民百姓) 和tuyile006(小y) lovevsnet(编程一把手)  说的那样
    我要做得就是在关机前处理稍微一下,保存一下数据,然后退出系统