C# 拦截Windows消息和Winforms

C# 拦截Windows消息和Winforms,c#,windows,winforms,windows-messages,C#,Windows,Winforms,Windows Messages,那么回到这个问题的开始。我已经使用System.Windows.Forms创建了一个文本编辑器。默认情况下,textbox控件在双击其包含的文本并高亮显示整行文本时接受事件。我想用一些不同的东西来替代这种行为。事实证明,这要求我截获启动此事件的windows消息,并防止其被触发。下面是我在Stackoverflow上找到的一个链接,它几乎一字不差地解释了我在做什么: 但是这个解释是不完整的!请注意,DoubleClickEvent继承自EventArgs。它应该继承自MouseEventArgs

那么回到这个问题的开始。我已经使用System.Windows.Forms创建了一个文本编辑器。默认情况下,textbox控件在双击其包含的文本并高亮显示整行文本时接受事件。我想用一些不同的东西来替代这种行为。事实证明,这要求我截获启动此事件的windows消息,并防止其被触发。下面是我在Stackoverflow上找到的一个链接,它几乎一字不差地解释了我在做什么:

但是这个解释是不完整的!请注意,DoubleClickEvent继承自EventArgs。它应该继承自MouseEventArgs。这是因为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);
    }
}
public类双击事件参数:MouseEventArgs
{
公共DoubleClickEventArgs(鼠标按钮按钮、整数单击、整数x、整数y、整数增量):基本(按钮、单击、x、y、增量){
公共图书馆
{
得到;
设置
}
}
公共类NewTextBox:System.Windows.Forms.TextBox
{
公共事件事件处理程序NewDoubleClick;
私有常量int WM_DBLCLICK=0xA3;
私有常量int WM_lbuttondblck=0x203;
受保护的覆盖无效WndProc(参考消息m)
{
if((m.Msg==WM_DBLCLICK)| |(m.Msg==WM_lbuttondblck))
{
DoubleClickEventArgs e=(DoubleClickEventArgs)m.GetLParam(typeof(MouseEventArgs));
if(NewDoubleClick!=null)
{
新建双击(此,e);
}
如果(如已处理)
{
返回;
}
}
基准WndProc(参考m);
}
}
正如您所看到的,它看起来与示例非常相似。为了让它在这一行上编译,我做了疯狂的转换DoubleClickEventArgs e=(DoubleClickEventArgs)m.GetLParam(typeof(MouseEventArgs));很明显是飞机坠毁的原因。我们得到一个错误:没有为这个对象定义无参数构造函数


这是有道理的。DoubleCLickEventArgs确实需要创建参数。但是参数是由LPRAM指针定义的。。。有人能给我一点指导吗?我正在努力。

要删除突出显示文本行为并提供您自己的:

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);
}

要删除突出显示文本行为并提供自己的行为,请执行以下操作:

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);
}

看见
GetLParam(t)
type参数必须引用一个
struct
。实际上,它不是指针,而是一个包含x和y坐标的整数。你是否只想删除默认行为(双击使文本高亮显示)?terrybozzio,这是我想做的一半。我还想在双击发生时提供不同的功能请参见。
GetLParam(t)
type参数必须引用一个
struct
。实际上,它不是指针,而是一个包含x和y坐标的整数。你是否只想删除默认行为(双击使文本高亮显示)?terrybozzio,这是我想做的一半。我还想在双击发生时提供不同的功能