zoukankan      html  css  js  c++  java
  • WinForm中DefWndProc、WndProc与IMessageFilter的区别

    Windows消息系统由3部分组成:

        1.消息队列。Windows应用程序的消息是由Windows统一在一个消息队列中管理的。
        2.消息循环。应用程序从Windows消息队列中获得自己的消息,并将其分配给窗口过程进行处理。
        3.窗口过程。负责处理接收到的消息,每个窗口都有对应的窗口过程,负责截获消息并响应。WndProc是窗口过程函数,负责处理接收到的消息,在我们写代码时,不会注意到有这个函数,这是因为开发环境自动为我们生成了。WndProc函数通过switch...case...判断并处理消息,对于在case中没有遇到的情况,会调用DefWndProc函数进行处理,所以,在C#中用户自定义消息,可以重载DefWndProc函数使用switch...case...判断并处理。
        C#中的事件就是对Windows消息的封装,窗口过程中定义了窗体的事件,一定程度就是为了让程序员避免过多的考虑消息等底层的东西,所以能避免消息机制解决的问题最好能避免。
     

    一般来说,Winform的消息处理机制多数时候是通过事件处理程序进行的,但当没有对应的事件时通常的做法是声明DefWndProc或者WndProc或者IMessageFilter,经常在网上看见有文章将三者并列,那么它们有什么区别呢?本文对此做一简单分析如下:

    DefWndProc和WndProc都是继承自Control类中的虚方法,其原型如下:

    protected override void DefWndProc(ref Message m)
    {
     ....
       base.DefWndProc(m);
    }
       
    protected override void WndProc(ref Message m);
    {
     .....
       base.WndProc(m);
    }

    所有的有用户界面的控件都继承自Control,这种方式需要创建对应控件的派生类,不能统一对各个窗口的消息进行拦截处理,因为从根本上说这两者都是Windows的窗口过程,只有收到针对本窗口自身的消息。

    通过复习Windows的消息处理机制,对这三者的关系可以有更好的理解。应用程序的消息来自于系统消息队列,被应用程序的主程序中的消息循环所处理。这个消息循环从应用程序的消息队列中取出消息,进行预处理,然后派发到消息对应的窗口过程,窗口过程在被调用后根据消息的类型进行相应的处理,有些可以由Windows默认处理的消息就调用Windows的DefWindowProc。

    这里的WndProc就是对应控件窗口的窗口过程,而DefWndProc会被WndProc调用,处理那些WndProc中未处理的消息(包括WndProc未吞掉的),因此DefWndProc收到的消息会比WndProc少。

    IMessageFilter的调用发生在应用程序的消息循环中,是消息预处理的一部分,所以它收到的消息是更全的(除了直接发送到窗口过程不进入消息队列的那些消息)。使用方式如下:

    public class MessageFilter : IMessageFilter
    {
     public bool PreFilterMessage(ref Message msg)
     {
       //识别消息并处理
      //return true;//吞掉消息,不派发
       return false;//进入下一步派发到对应窗口过程
     }
    }
       
    //在应用程序消息循环中加入消息过滤器
    MessageFilter f = new MessageFilter(this.lbMsg);
    Application.AddMessageFilter(f);
  • 相关阅读:
    e552. 取Applet的参数
    e551. 精简的Applet
    e558. 在Applet中多图片交互显示
    e1087. try/catch语句
    e1086. if/else语句
    e1087. 用For循环做数组的遍历
    e1084. 捕获错误和异常
    Zookeeper 应用程序
    Zookeeper API
    Java并发编程:volatile关键字解析
  • 原文地址:https://www.cnblogs.com/suntp/p/7804248.html
Copyright © 2011-2022 走看看