protected override void WndProc(ref Message m )
{
if (m.WParam.ToInt32()== 0xF060) // 关闭消息
{
//去做你愿意的事情
}
base.WndProc(ref m); // ...let Form take care of this message (normally)
}

解决方案 »

  1.   

    处理的方法是对的。VC里当关机的时候应用程序都会收到一个WM_消息,具体名字忘了。你应该查MSDN,找到这个消息。
      

  2.   

    protected override void WndProc(ref Message m )
    {
                                if (m.WParam.ToInt32()== 0x0112) // 关闭系统
    {
    //去做你愿意的事情
    } if (m.WParam.ToInt32()== 0xF060) // 关闭程序
    {
    //去做你愿意的事情
    }
    base.WndProc(ref m); // ...let Form take care of this message (normally)
    }
      

  3.   

    或者:
    protected override void WndProc(ref Message m )
    {
                                if (m.WParam.ToInt32()== 0x0112 || m.WParam.ToInt32()== 0xF060) 
    {
    //去做你愿意的事情
    } base.WndProc(ref m); // ...let Form take care of this message (normally)
    }
      

  4.   

    刚刚找到这个:当用户关闭计算机时,Windows发送WM_QUERYENDSESSION消息给应用程序,程序此时决定是否允许关闭。然后,系统发送WM_ENDSESSION消息通知程序系统即将关闭。你可以在ClassWizard中响应WM_ENDSESSION消息,在其中完成善后工作。但这些消息常量是在那个类里定义的呢?怎么都没找着啊?
      

  5.   

    又有一个问题:Windows 的WindowsProc()是LRESULT的,但Contorls.WndProc()是void的,是用Message.Result返回值吗?但Message.Result又是IntPtr结构的,怎么返回布尔值啊?
      

  6.   

    那是标准的windows message,你可以看看vc技术内幕第三章(好像是,反正是某一章的末尾)
    c#的还没有搞过。
      

  7.   

    我要问的就是C#啊,VC当然就return啦
      

  8.   

    有关消息常量对应的实际数值查询,最好的办法是用C++ Builder,直接在源程序中写一个常量,按Ctrl键便可找到常量定义的.h文件,很方便,C++ Builder中也有所有的API函数使用的详细说明,方便得很!