zoukankan      html  css  js  c++  java
  • C#实现在Form上截取消息的两种方法

    比较常用的是重载Form的DefWndProc方法,例如截取鼠标按下的消息:

    protected override void DefWndProc(ref Message m)
        {
          if ( m.Msg == 0x0201 )
          {
            MessageBox.Show(m.Msg.ToString());
          }
          else
          {
            base.DefWndProc (ref m);
          }
        }

    还可以通过另一种办法,使用IMessageFilter 接口:

    public class MessageFilter : IMessageFilter
      {
            public bool PreFilterMessage(ref Message m)
            {
                if (m.Msg == 0x0201)
                {
                    MessageBox.Show("WM_LBUTTONDOWN is: " + m.Msg);
                    return true;
                }
                return false;
        }
      }

      然后使用Application.AddMessageFilter方法,例如:

      private static MessageFilter msgFliter = new MessageFilter();

      在Main方法中注册消息筛选器:

      Application.AddMessageFilter(msgFliter);

      如果要取消注册,可以调用Application.RemoveMessageFilter方法

      在这里有一个Windows的MessageID的枚举,挺有用的,好几次都忘了地址,这次写在这里好好保存

      Windows Message ID constants

     

     

     

    一、截取系统消息

    方法一:

    //添加监视消息
    private void Form_Load(object sender, System.EventArgs e)
    {
      Application.AddMessageFilter(this);
    }

    //撤消消息监视
    private void Form_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
      Application.RemoveMessageFilter(this);
    }

    //截取消息,进行处理
    public bool PreFilterMessage(ref System.Windows.Forms.Message m)
    {
      switch(m.Msg )
      {
        case 513:        //拦截左键单击事件 
          MessageBox.Show("哈哈,你点击了左键被拦截!");
          return true;    //返回true则消息被裁取,系统不再处理
        case 516:        //拦截左键单击事件 
          MessageBox.Show("哈哈,你点击了右键被拦截!");
          return true;    //返回true则消息被裁取,系统不再处理
        default:
          return false;    //返回false则消息未被裁取,系统会处理
      }
    }

    方法二:

    //截取消息,进行处理 
    protected override void WndProc(ref Message m) 
    {
      switch(m.Msg)
      {
        case 17:
          MessageBox.Show("哈哈,你不能关闭计算机!");
          m.Result=(IntPtr)0;
          break;
        case 513:
          MessageBox.Show("哈哈,你不能点击左键!"); 
          m.Result=(IntPtr)0;
          break;
        case 516:
          MessageBox.Show("哈哈,你不能点击右键!"); 
          m.Result=(IntPtr)0;
          break;
        default:
          base.WndProc(ref m);
          break;
      }
    }

  • 相关阅读:
    《软件需求模式》阅读笔记二
    《软件需求模式》阅读笔记一
    《编写有效用例》阅读笔记三
    《编写有效用例》阅读笔记二
    《编写有效用例》阅读笔记一
    《软件需求十步走》阅读笔记三
    英文一分钟自我介绍
    c语言面试常见题
    docker
    LLDP
  • 原文地址:https://www.cnblogs.com/milantgh/p/4007271.html
Copyright © 2011-2022 走看看