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);
WinForm中DefWndProc、WndProc与IMessageFilter的区别