public class MyMessageFilter : IMessageFilter
{
const int WM_LBUTTONDOWN = 0x201;
/// <summary>
/// The control to monitor
/// </summary>
public Control ParentControl;
public MouseEventHandler MouseDoubleClick;
public MouseEventHandler MouseUp;
public MouseEventHandler MouseDown;
public KeyEventHandler KeyDown;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="parentControl">右键所在的控件</param>
/// <param name="mouseDoubleClick">双击事件</param>
/// <param name="mouseUp">鼠标释放事件</param>
/// <param name="mouseDown"></param>
/// <param name="keyDown"></param>
public MyMessageFilter (Control parentControl, MouseEventHandler mouseDoubleClick,
MouseEventHandler mouseUp, MouseEventHandler mouseDown,KeyEventHandler keyDown)
{
ParentControl = parentControl;
MouseDoubleClick = mouseDoubleClick;
MouseUp = mouseUp;
MouseDown = mouseDown;
KeyDown = keyDown;
}
/// <summary>
/// 过滤消息
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public bool PreFilterMessage(ref Message m)
{
//判断是否未指定的控件下触发的消息,如果不判断整个主程序任何地方的消息都会触发这里
if (ParentControl == null || ParentControl.IsDisposed || m.HWnd != ParentControl.Handle ||
MouseDoubleClick == null)
return false;
MouseButtons mb = MouseButtons.None;
bool isDoubleClick = false;
switch (m.Msg)
{
case 0x0202://鼠标左键UP
mb = MouseButtons.Left;
break;
case 0x0205://鼠标右键UP
mb = MouseButtons.Right;
break;
case 0x0203:/*鼠标左键双击*/
isDoubleClick = true;
break;
case 0x201://鼠标左键Down
break;
case 0x100://键盘按下
if (KeyDown != null)
{
Keys keyPressed = (Keys)m.WParam.ToInt32() | Control.ModifierKeys;
KeyDown(ParentControl,new KeyEventArgs(keyPressed));
}
break;
}
//双击
if (isDoubleClick && MouseDoubleClick != null)
{
MouseEventArgs e = new MouseEventArgs(mb, 2, m.LParam.ToInt32() & 0xFFff, m.LParam.ToInt32() >> 16, 0);
MouseDoubleClick(ParentControl, e);//触发双击事件
return false;
}
//鼠标按键没有按下
if (mb == MouseButtons.None || MouseUp == null)
return false;
//单击
var upE = new MouseEventArgs(mb, 1, m.LParam.ToInt32() & 0xFFff, m.LParam.ToInt32() >> 16, 0);
MouseUp(ParentControl, upE);
return false;
}