C# 复习笔记 消息与事件处理

原创 2016年05月30日 15:25:09

C# 复习笔记 消息与事件处理

学习Windows编程后,有时候需要对系统消息或者事件做出自己的响应或者说自己拦截一些消息,实现某个事件或者函数的触发,这时就需要对系统消息进行处理.
大多数直接开始学习C#没有对C++有太多了解的猿们(包括我在内),都不太了解消息机制,还是看看百度百科的解释吧:百度百科对Windows消息机制的解释
简单的说,我个人理解,Windows是建立在消息机制上的.消息机制大致就是,Windows内核维护了一个消息列队,消息则是通过外部或者系统程序产生的一系列动作,比如鼠标点了窗体,而这些消息进入了消息队列,系统将不同的消息派发给不同的程序,程序会对消息进行处理,就是窗体过程,有些消息需要回调给系统,有些则不需要,取决于发送消息的方法.而C#的事件则是对消息的进一步封装.理解不太透彻,可以研究这篇博http://www.cnblogs.com/skyofbitbit/p/3649104.html 讲得很透彻

现在说一下C#中对消息的操作:
方法一,实现IMessageFilter接口来获取消息.IMessageFilter接口用来定义消息筛选器接口,该接口的PreFilterMessage方法用来在调度消息之前将其筛选出来。可以在VS中的对象浏览器看到.
他的实现如下:

namespace MessageDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Application.AddMessageFilter(new msgFilter());
        }
    }

    public class msgFilter:IMessageFilter
    {
        public bool PreFilterMessage(ref Message m)
        {
            switch (m.Msg)
            {
                case 0x201:
                    MessageBox.Show("Left Click");
                    return true;
                case 0x205:
                    MessageBox.Show("Right Click");
                    return true;
                default:
                    return false;
            }
        }
    }
}

程序中继承了接口IMessageFilter并实现了PreFilterMessage方法.获得了该窗口句柄了消息,实现了对消息的截取.

方法二 使用Control类的虚方法WndProc来截取Windows消息,基类为Control类的所有控件都有一个protected virtual void WndProc(ref Message m) 的虚方法。只要重载该虚方法,那么这个控件聚焦后就可以扑捉windows消息,并触发该方法了

namespace MessageDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        protected override void WndProc(ref Message m)
        {
           switch (m.Msg)
           {
               case 0x201:
                   MessageBox.Show("Left Click");
                   break;
               case 0x205:
                   MessageBox.Show("Right Click");
                   break;
               default:
                   break;
           }
            base.WndProc(ref m);
        }
    }
}

方法三 通过重载C#事件实现:

namespace MessageDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    MessageBox.Show("Left Click");
                    break;
                case MouseButtons.Right:
                    MessageBox.Show("Right Click");
                    break;
                default:
                    break;
            }
            base.OnMouseDown(e);
        }
    }
}

以上三种方法都实现了对windows消息的截获,但是方法一和方法二可以认为是原生的消息机制的处理方法,而方法三则是C#封装了之后的消息,就是事件来变像实现对消息的截获.方法一二可以实现自定义消息的截获而方法三不行,但是方法三更简单,不需去查询系统的消息ID,而且不需要自己去实现,我认为可以减少bug的存在…

最后自定义消息的收发:
这段程序实现了,button1按下后,通过系统API发送了一个自定义的消息,并自己接收.

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public const int myMessage = 0x0400;//自定义消息ID,注意不要和系统消息冲突

        [DllImport("user32.dll")]
        public static extern void PostMessage(IntPtr hWnd, int msg, int wParam, int lParam);

        public Form1()
        {
            InitializeComponent();
        }

        private void GetMessage()
        {
            MessageBox.Show("Got Message From Myself");
        }

        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case myMessage:
                    GetMessage();
                    break;
                default:
                    base.WndProc(ref m);
                    break;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            PostMessage(this.Handle, myMessage, 168, 51898);
            Thread.Sleep(2000);
        }
    }
}

系统API除了PostMessage,还有SendMessage,上面的博中已经有了,就不多说了.
最后需要说一句,一定在自己接收了消息后,一定要我们重载基类的方法,要不然,消息就到程序这就不会再继续转发(除非这是自定义消息),又是一个坑,不要跳哟….
大致就这样,有错的请大神指正.

版权声明:本文为博主原创文章,可以随意转载。

相关文章推荐

深入GetMessage和PeekMessage

from:http://blog.csdn.net/fireseed/archive/2002/09/10/2176.aspx深入GetMessage和PeekMessage Bob Gunderso...

Win32消息处理API---GetMessage

02、GetMessage功能说明WinCE下:该函数从呼叫进程的消息队列中检索消息,并且将所检索到的消息放入到一个指定的结构体(即MSG结构)中;Win32下:该函数从呼叫进程的消息队列中检索消息,...

Win32消息处理API---PeekMessage

03、PeekMessage功能说明WinCE/Win32:该函数从进程消息队列中检索一个消息,并将该消息(如果存在的话)赋值给指定的消息结构。跟GetMessage不同之处在于:PeekMessag...

Win32消息

一、消息概念消息就是在事件驱动模式下,事件发布函数和具体功能执行函数(或者代码段)之间的调用协议,调用协议的执行表现为窗口事件发布函数跟具体功能执行函数(或者代码段)之间的选择关系。在Windows系...

libgdx API之AI:AI让游戏对象思考

GdxAI是libgdx的一个AI库,里面有各种AI系统和算法,包括有限状态机,状态树,行为算法(追逐,躲避...群聚),路径算法。基于Message和Scheduler两种事件驱动机制。这绝对是个好...

C#中消息处理机制(事件与委托)

编写过Windows桌面应用程序的人都知道,微软的Windows操作系统与应用程序之间的通信绝大部分是基于消息循环机制的。在VC++中,程序使用GetMessage,TranslateMessage,...

LibGDX_2.4: 文件的操作(FileHandle)

LibGDX 应用运行在不同的平台: Desktop 系统(Windows,Linux,MAC OS X),Android, iOS 和 支持 JavaScript/WebGL 的浏览器,每一个平台对...

Windows消息机制详解

文章转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/18/90412.html,感谢原作者。 消息是指什么?      消息系统对于一个wi...
  • mfcing
  • mfcing
  • 2015-03-09 15:35
  • 2527

C#.NET 消息机制

一、消息概述      众人周知,window系统是一个消息驱动的系统, windows操作系统本身有自己的消息队列,消息循环,它捕捉键盘,鼠标的动作生成消息,并将这个消息传给应用程序的消息队列。 余...
  • fan158
  • fan158
  • 2011-02-11 11:02
  • 11303

C#的事件处理机制

在以往的关于事件处理的程序中,我们更多的是采用一种循环等待的方式,即为了检测某个事件是否发生,循环的检测某个变量是否发生变化但这样会占用大量的资源。而C#   的事件处理机制提供了一种非常好的解决方案...
  • niuox
  • niuox
  • 2012-05-02 14:32
  • 5925
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)