所以回到这个问题的开始。 我有使用System.Windows.Forms来创build一个文本编辑器。 默认情况下,文本框控件在双击包含文本时接受一个事件,并高亮显示整行文本。 我想用不同的东西来覆盖这个行为。 事实certificate,这要求我拦截启动这个事件的Windows消息,并防止它被触发。 这里是我在Stackoverflow上find的一个链接,几乎逐字解释我在做什么: 是否可以通过双击来禁用文本框的select部分
但是这个解释是不完整的! 请注意,DoubleClickEvent从EventArgsinheritance。 它应该从MouseEventArgsinheritance。 这是因为PreviewDoubleClick将需要来自Windows消息的关于屏幕被点击的信息。 所以这就是我要完成的任务:覆盖doubleclick事件,但仍然从Windows消息发送所有的点击信息。
如果我在代码中设置断点,我开始看到我的信息存储在哪里。 消息m包含一些属性,其中之一称为LParam。 据我所知,这是一个指向我想要检索的点击信息的指针。 但是,这不是C ++ …我不能只取消指针。 .NET方便地提供了Message.GetLParam方法来帮助我。 我无法使这个方法工作。
这是我的代码:
public class DoubleClickEventArgs : MouseEventArgs { public DoubleClickEventArgs(MouseButtons Button, int clicks, int x, int y, int delta) : base (Button, clicks, x, y, delta) { } public bool Handled { get; set; } } public class NewTextBox : System.Windows.Forms.TextBox { public event EventHandler<DoubleClickEventArgs> NewDoubleClick; private const int WM_DBLCLICK = 0xA3; private const int WM_LBUTTONDBLCLK = 0x203; protected override void WndProc(ref Message m) { if ((m.Msg == WM_DBLCLICK) || (m.Msg == WM_LBUTTONDBLCLK)) { DoubleClickEventArgs e = (DoubleClickEventArgs) m.GetLParam(typeof(MouseEventArgs)); if (NewDoubleClick != null) { NewDoubleClick(this, e); } if (e.Handled) { return; } } base.WndProc(ref m); } }
正如你所看到的,看起来很像样本。 我做了这个疯狂的转换,以在这一行上编译DoubleClickEventArgs e =(DoubleClickEventArgs)m.GetLParam(typeof(MouseEventArgs)); 显然是造成这次事故。 我们得到错误:没有为这个对象定义无参数的构造函数。
这就说得通了。 DoubleCLickEventArgs确实需要创build参数。 但参数是由lParam指针定义的…任何人都可以在这里给我一点指导吗? 我正在挣扎。
要删除突出显示的文本行为并提供您自己的:
private const int WM_DBLCLICK = 0xA3; private const int WM_LBUTTONDBLCLK = 0x203; protected override void WndProc(ref Message m) { if ((m.Msg == WM_DBLCLICK) || (m.Msg == WM_LBUTTONDBLCLK)) { //your behavior here like for example //this.ForeColor = Color.Red; return; } base.WndProc(ref m); }