#region form 窗体消息拦截
const int WM_RBUTTONDOWN = 0x0204; //右键单击
const int WM_LBUTTONUP = 0x0202; //左键释放
const int WM_NCLBUTTONDBLCLK = 0x203; //左键双击
const int WM_LBUTTONDOWN = 0x0201; //左键单击
const int WM_QUERYENDSESSION = 0x0011 //关机
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_LBUTTONDOWN:
m.Result = IntPtr.Zero;
break;
default:
base.WndProc(ref m);
break;
}
}
#endregion
#region 控件消息拦截
private const int GWL_WNDPROC = -4;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, MyWndProc wndProc);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr CallWindowProc(IntPtr wndProc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
public delegate IntPtr MyWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
private IntPtr OldWndProc = IntPtr.Zero;
private MyWndProc Wpr = null;
private IntPtr MyControlWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
{
switch (msg)
{
case WM_LBUTTONDOWN:
ButtonOnClick();
return (IntPtr)0;
default:
return CallWindowProc(OldWndProc, hWnd, msg, wParam, lParam);
}
}
//控件变量名为 XX
private void InitializeThatControl()
{
//初始化的时候安装消息拦截
this.Wpr = new MyWndProc(this.MyControlWndProc);
this.OldWndProc = SetWindowLong(XX.Handle, GWL_WNDPROC, Wpr);
}
//然后在窗体构造函数中加入InitializeThatControl()
#endregion
#region 重载 控件,添加响应双击事件
/// <summary>
/// 重载 RichTextBox 控件,可以响应双击事件
/// </summary>
public class MyRichTextBox : RichTextBox
{
public delegate void DoubleClickHandler(object sender, System.EventArgs e);
public event DoubleClickHandler DoubleClicked;
protected override void OnDoubleClick(EventArgs e)
{
if (DoubleClicked != null)
DoubleClicked(this, new System.EventArgs());
}
protected override void WndProc(ref Message m)
{
// 鼠标双击
if (m.Msg == NCLBUTTONDBLCLK )
{
OnDoubleClick(new EventArgs());
}
base.WndProc(ref m);
}
}
#endregion