C#委托、事件、消息(入门级)(再续)

  Windows操作系统是图形界面的,而这是由于信息队列机制的功劳。

  通常我们说的消息,很多是广义的概念,我们把对象之间的通信称作消息交互。通过消息,对象之前建立起联系。

  那么我们WinForm程序中的消息是指什么呢?我们说:WinForm程序中的消息,很多时候是指操作系统向WinForm窗体(这里说得不是很对,但是先这样理解没有问题)发送的消息,告诉它某一个事件发生了。比如鼠标点击,我们是不可能知道、窗体本身也不会知道鼠标被点击,但操作系统知道鼠标被点击了,它会发送消息到窗体告诉它:鼠标被点击了,你应该做出反应了。

  当消息被窗体拿到之后,窗体会处理。比如鼠标被点击了,操作系统通过发消息的形式告诉窗体 ,窗体就调用了鼠标点击事件,事件会调用我们为它绑定的方法,我们的预期效果就达到了。

  理解起来其实不难,那么我们就消息的产生、发送及处理三个阶段来说明一下

  由于我们是入门级的讲解,我就简单地提一下。

  ①消息的产生:大家都知道,机器是不会模式思考的,但是操作系统之所以能够明白我们点击了鼠标,敲击了键盘,那么估计(我的猜想)应该是凭借电流的断续神马。当然,这一点我们又没办法做到……

  消息有很多种,每一种对应一个操作,比如点击鼠标、敲击键盘…… 

  ②消息的发送。

  消息产生之后,系统会将其封装,大家都知道,封装之后就成为了一个对象

namespace System.Windows.Forms
{
// 消息类
public struct Message
{

// ……

// 摘要:
// 获取或设置消息的窗口句柄。
//
// 返回结果:
// 消息的窗口句柄。
public IntPtr HWnd { get; set; }
//
// 摘要:
// 指定消息的 System.Windows.Forms.Message.LParam 字段。
//
// 返回结果:
// 消息的 System.Windows.Forms.Message.LParam 字段。
public IntPtr LParam { get; set; }
//
// 摘要:
// 获取或设置消息的 ID 号。
//
// 返回结果:
// 消息的 ID 号。
public int Msg { get; set; }
//
// 摘要:
// 指定为响应消息处理而向 Windows 返回的值。
//
// 返回结果:
// 消息的返回值。
public IntPtr Result { get; set; }
//
// 摘要:
// 获取或设置消息的 System.Windows.Forms.Message.WParam 字段。
//
// 返回结果:
// 消息的 System.Windows.Forms.Message.WParam 字段。
public IntPtr WParam { get; set; }

// ……
public override string ToString();
}
}

  以上是C#封装的窗体消息类,我省略了一些属性和方法。

  经过封装的消息到了C#语言处有四个属性:窗体句柄,消息编号,参数1,参数2。

  句柄很好理解,就是窗体的编号(动态且唯一)。消息编号是……就是消息编号,16进制数据。参数里面一般有可能拿到鼠标的坐标。

  Windows操作系统通过窗口句柄将消息发送到对应窗体。所有信息被操作系统维护到一个消息队列中,并被操作系统分发。

  ③消息的处理。

  我们来看看WinForm窗体拿到消息时进行怎样的处理。首先会有一个方法最先拿到消息进行判断,然后该方法会通过消息的类型来引发不同的事件。

  我们是基础性的说一下消息,对于消息的发送和拦截,以及自定义的消息及消息队列是以后再探讨。

  2012-04-04 19:03:39

原文地址:https://www.cnblogs.com/Johness/p/2432228.html