[转] C#中如何截取Windows消息来触发自定义事件

时间:2021-08-06 17:14:12

原文 C#中如何截取Windows消息来触发自定义事件

在c#windows开发中,我们常常会遇到拦截windows消息,来触发某个特定任务的问题。

由于目前使用c#的开发人员非常多,而且大多数c#程序员都不是从Windwos c++转过来的对windows消息机制不怎么了解,遇到这类问题还是挺棘手的,我们公司有个同事问,,就写这个小实例,帮助那些遇到此类问题的兄弟姐妹。

实现方式目前有两种:

1 使用Control类的虚方法WndProc来截取Windows消息

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

protected override void WndProc(ref Message m)
        {
            switch (m.Msg)                               //判断系统消息的ID号     
            {
                case 513:
                    MessageBox.Show("恭喜你点击了左键!");
                    m.Result = (IntPtr)0;                  //为了响应消息处理而向 Windows 返回的值        
                    break;
                case 516:
                    MessageBox.Show("恭喜你点击了右键!");
                    m.Result = (IntPtr)0;                //为了响应消息处理而向 Windows 返回的值          
                    break;
                default:
                    base.WndProc(ref m);
                    break;
            }
        }

2 通过实现IMessageFilter接口,来截取获Windows消息。

IMessageFilter接口用来定义消息筛选器接口,该接口的PreFilterMessage方法用来在调度消息之前将其筛选出来。他的实现如下:

public class MessageFilter : IMessageFilter
    {
        public bool PreFilterMessage(ref Message message) //实现PreFilterMessage方法    
        {
            switch (message.Msg)                               //判断系统消息的ID号     
            {
                case 513:
                    MessageBox.Show("恭喜你点击了左键!");
                    return true;
                case 516:
                    MessageBox.Show("恭喜你点击了右键!");
                    return true;
                default:
                    return false;
            }
        }
    }

那么如何使用这个类? 其实在类Application中有个AddMessageFilter(IMessageFilter value)的静态方法,只要添加进去就可以,

例如:Application.AddMessageFilter(MessageFilter); 加进去可别忘了,加进去的消息过滤器也可删除Application。RemoveMessageFilter(IMessageFilter value);

后附跟windows消息ID列表: