有没有方法接收系统的关机信息?

解决方案 »

  1.   

    有一个windows API函数发送系统关机消息,C#程序可以监听这个消息,然后阻止windows关机。不记得这个函数了,找找看。
      

  2.   

    不让关机是吧,看下面的代码:
    private const int WM_QUERYENDSESSION=0x0011;
    protected override void WndProc(ref Message m)
    {
    switch(m.Msg)
    {
    case WM_QUERYENDSESSION:
    m.Result=(IntPtr)0;
    break;
    default:
    base.WndProc(ref m);
    break;
    }

    }
      

  3.   

    lovevsnet(编程一把手)真是编程一把手
      

  4.   

    Bliss_qingyang,你说的不对,我很菜的,是一把手编程
      

  5.   

    假如我需要由程序log.exe在C盘根目录下创建一个文本文件(log.txt)来记录Message,当当前Message为关机的对应消息时,写出记录并退出程序,如何实现?(附:在Form的Load事件和 Closing、Closed事件里面都实现不了)
      

  6.   

    引用 lovevsnet(编程一把手) ( 的回复
    private const int WM_QUERYENDSESSION=0x0011;
    protected override void WndProc(ref Message m)
    {
    switch(m.Msg)
    {
    case WM_QUERYENDSESSION:
    //写保存代码 break;
    default:
    base.WndProc(ref m);
    break;
    }

    }
      

  7.   

    你是不是还要处理其它消息?
    反正用我上面的就行了,为了测试我关了N回机了
    private const int WM_QUERYENDSESSION=0x0011;
    protected override void WndProc(ref Message m)
    {
    switch(m.Msg)
    {
    case WM_QUERYENDSESSION:
    StringBuilder sb=new StringBuilder(512);
    GetPrivateProfileString("Option","不允许关机","Yes",sb,sb.Capacity,"c:\\1.ini");
    if(sb.ToString()=="Yes")
    {
    m.Result=(IntPtr)0;
    }
    else
    {
    WritePrivateProfileString("Option","关机时间",DateTime.Now.ToString(),"c:\\log.ini");
    base.WndProc(ref m);
    } //WritePrivateProfileString("Option","不允许关机","Yes","c:\\log.ini");
    //GetPrivateProfileString("Option","不允许关机","Yes","c:\\log.ini");
    break;
    default:
    base.WndProc(ref m);
    break;
    }

    }不要告诉我你连那两个API也不会哦
    好了也写一下吧:
    [DllImport("kernel32")]  
    private static extern long WritePrivateProfileString(string   
    section,string key,string val,string filePath);  
    [DllImport("kernel32")]  
    private static extern int GetPrivateProfileString(string section,string key, string def,StringBuilder retVal,int size,string filePath);  
    如果你要进行别的处理改一下上面的就行了,祝你好运!
      

  8.   

    我是个新手,对这个问题很感兴趣。
    请问lovevsnet(编程一把手)
    WndProc()函数的参数是怎么获得的,问题太简单了,不要笑我。
      

  9.   

    在你的程序中加上事件:
    Microsoft.Win32.SystemEvents.SessionEnding += 
    new Microsoft.Win32.SessionEndingEventHandler(this.OnSessionEnding); private void OnSessionEnding( object sender,Microsoft.Win32.SessionEndingEventArgs e ) 

    //这里写你的日志文件,如果要取消这次操作(注销或者关闭系统)将e.cancel=true 
    }  
      

  10.   

    一把手:你那个程序需要添加什么引用吗?
    大康:去哪里找那个Microsoft命名空间。
      

  11.   

    系统在关机的时候会向每一个程序发送一个WM_QUERYENDSESSION消息,你就处理这个消息就可以了
      

  12.   

    Assembly: System (in system.dll) using Microsoft.Win32;
      

  13.   

    原来楼主就要那么简单的功能啊, wuyazhe(我的宝贝叫阿刺) 不是说了,就那么做吧
    private const int WM_QUERYENDSESSION=0x0011;
    protected override void WndProc(ref Message m)
    {
    switch(m.Msg)
    {
    case WM_QUERYENDSESSION:
    //写保存代码
    base.WndProc(ref m);
    break;
    default:
    base.WndProc(ref m);
    break;
    }}
      

  14.   

    protected override void WndProc(ref Message m)
    是用在WINFORM下的,WEBFORM没
    也不要添加什么引用
    请在VS。NET2003(OR 2005)中手动输入:protected override 
    按空格后就会有个下拉框让你选择要重写什么事件
    你选择后自动为你添加了基本的代码,你只要加入你要的代码就行了
      

  15.   

    to:lovevsnet(编程一把手),如何继续执行系统关机事件呢?
    我在程序中写了如下代码:
    protected override void WndProc(ref Message m)
            {
                int WM_ENDSESSION = 0x0016;
                if (m.Msg == WM_ENDSESSION)
                {
                    if (MessageBox.Show("关闭xxx程序?", "xxx管理程序", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel)
                        return;
                    else
                    {
                        m.WParam = (IntPtr)0;
                        m.Result = (IntPtr)1;
                        this.Close();
                    }
                }
                base.WndProc(ref m);
            }
    当关机时系统弹出了提示,但我点击确定后,程序是关闭了,但系统不继续关闭呢,要再执行一下关机才行,这是怎么回事?我怎么做才能继续关机?
    谢谢!
      

  16.   

    to:lovevsnet(编程一把手),如何继续执行系统关机事件呢?
    我在程序中写了如下代码:
    protected override void WndProc(ref Message m)
            {
                int WM_ENDSESSION = 0x0016;
                if (m.Msg == WM_ENDSESSION)
                {
                    if (MessageBox.Show("关闭xxx程序?", "xxx管理程序", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel)
                        return;
                    else
                    {
                        m.WParam = (IntPtr)0;
                        m.Result = (IntPtr)1;
                        this.Close();
                    }
                }
                base.WndProc(ref m);
            }
    当关机时系统弹出了提示,但我点击确定后,程序是关闭了,但系统不继续关闭呢,要再执行一下关机才行,这是怎么回事?我怎么做才能继续关机?
    谢谢!