原文 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列表: