标签:style blog class c ext color
在C#编程中,经常会遇到一些场景,如禁止鼠标拖动窗体,启用某些快捷键,禁止鼠标移动等。遇到这些需求,可以通过窗体的MouseMove事件,OnDragDrop,OnMove等事件来解决问题,
但是该方法有个缺点是,只能在当前窗体或控件上起作用,如果窗体或控件被覆盖,就不起作用了。而我们在开发时经常会碰到一个Form上有很多控件的情形,本节将讲述如何通过捕捉windows消息的方式来实现这个功能。
一般来讲,实现该功能有两种方法,
1. 通过重写WndProc(ref Message m)来实现,方法签名如下:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
}
其中的Message中包含了以下几个字段信息,是和windows消息相关的,
public IntPtr LParam { get; set; }
public int Msg { get; set; } // 获取或设置消息的 ID 号。
public IntPtr WParam { get; set; }
如:
如果我们要禁用窗体的拖拽,代码如下:
2. 通过继承接口来实现System.Windows.Forms.IMessageFilter接口实现,接口声明如下:
public interface IMessageFilter
{
//
摘要:
// 在调度消息之前将其筛选出来。
//
// 参数:
// m:
//
要调度的消息。无法修改此消息。
//
// 返回结果:
//
如果筛选消息并禁止消息被调度,则为 true;如果允许消息继续到达下一个筛选器或控件,则为 false。
bool
PreFilterMessage(ref Message m);
}
还以禁止拖动窗体为例,实现MessageFilter类如下:
注意:实现IMessageFilter接口时,一定要注意其返回值, [如果筛选消息并禁止消息被调度,则为 true;如果允许消息继续到达下一个筛选器或控件,则为 false。] ,对拦截的消息处理之后,一定要注意对返回值进行处理,如果对不处理的消息,一定要返回为false,让其他的控件去处理消息。
关于Windows消息,请参考文章 http://www.cnblogs.com/lenmom/p/3730179.html
标签:style blog class c ext color
原文地址:http://www.cnblogs.com/lenmom/p/3730173.html