none
拦截系统关机信息不让系统关机的代码没被执行? RRS feed

  • 问题

  • protected override void WndProc(ref Message m)
    {
      switch(m.Msg)
      {
        case 17:
          MessageBox.Show("哈哈,你不能关闭计算机!");
          m.Result=(IntPtr)0;
          break;
            default:
          base.WndProc(ref m);
          break;
      }

    }

    messagebox是弹出来了但是机器还是关闭了,为什么不能阻止关机?如果代码错了,该怎么改?( 编译环境:vs2005)
    2009年9月5日 11:30

答案

  • 您试验下 去掉messagebox 换成一个不阻塞线程的 form.show 看看 可能是 msgbox 阻塞了线程 反对关机的信息没有发出去
    恭喜自己5星用户达成
    • 已标记为答案 BigBadBoy 2009年9月7日 4:56
    2009年9月7日 1:56
    版主
  • 你好!
         可以参考这个列表:
    http://bbs.51cto.com/thread-487045-1.html
    周雪峰
    • 已标记为答案 BigBadBoy 2009年9月7日 14:41
    2009年9月7日 14:34
    版主

全部回复

  • 您试验下 去掉messagebox 换成一个不阻塞线程的 form.show 看看 可能是 msgbox 阻塞了线程 反对关机的信息没有发出去
    恭喜自己5星用户达成
    • 已标记为答案 BigBadBoy 2009年9月7日 4:56
    2009年9月7日 1:56
    版主
  • 你好你可以参考下

    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);
    }
    }

    Reference:http://topic.csdn.net/u/20070108/13/a831e7d8-e723-4e8f-a02d-29c056643e81.html

    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月7日 1:59
    版主
  • 现在对线程还不了解,不知道什么是不阻塞线程的form.show不过把messagebox去掉后再关机果然阻止关机成功......看来要学的还有很多......thanks........
    2009年9月7日 4:59
  • 你好!
         类似于这样:
    private   void   form1_Load(object   sender,   System.EventArgs   e)
    {
    //.....
    }
    周雪峰
    2009年9月7日 5:44
    版主
  • 你好你可以参考下

    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);
    }
    }

    Reference:http://topic.csdn.net/u/20070108/13/a831e7d8-e723-4e8f-a02d-29c056643e81.html

    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond

    消息id在512到515的消息是禁止使用鼠标左键.......将mm.msg==17 机器还是关闭了,为什么?br/>
    2009年9月7日 14:08
  • 你好!
         可以参考这个列表:
    http://bbs.51cto.com/thread-487045-1.html
    周雪峰
    • 已标记为答案 BigBadBoy 2009年9月7日 14:41
    2009年9月7日 14:34
    版主
  • 或是WinUser.h中的定义!
    周雪峰
    2009年9月7日 14:40
    版主