捕获.NET TextBox的MouseDown事件

时间:2008-08-11 12:36:20

标签: c# .net events windows-mobile

有没有办法甚至从.NET 2.0 TextBox控件捕获MouseDown? 我知道继承的Control类有事件,但它没有在TextBox中公开。 有没有办法覆盖事件处理程序?

我也尝试过暴露了MouseDown事件的OpenNETCF TextBox2控件,但无论我做什么,它都不会触发处理程序。

有什么建议吗?


  

什么样的疯狂移动设备   你有鼠标吗? :)

是的,Windows Mobile没有实际鼠标,但您错误的是Windows Mobile .NET不支持鼠标事件。单击或移动屏幕仍被视为“鼠标”事件。它是通过这种方式完成的,因此代码可以轻松地从完整的Windows移植。这不是Windows Mobile特定的问题。 Windows上的TextBox控件也没有本机鼠标事件。在这种情况下,我恰巧正在使用Windows Mobile。

编辑:并注意到......因为Windows Mobile是由WindowsCE核心构建的,它通常用于嵌入式桌面系统和Slim终端服务客户端或“WinTerms”,它支持硬件鼠标并具有很久。大多数设备都没有插入的端口。


  

根据.Net Framework,   TextBox上的MouseDown事件处理程序   得到支持。当你发生什么事   尝试运行代码?

实际上,那只是因为它从“Control”继承它,就像每个其他Form控件一样。但是,它在TextBox类中被覆盖(并且我认为是私有的)。因此它不会出现在Visual Studio中的IntelliSense中。

但是,您实际上可以编写代码:

textBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseDown);

它将编译并运行得很好,唯一的问题是当您点击TextBox控件时不会触发textBox1_MouseDown()。我认为这是因为事件在内部被覆盖。我甚至不想在内部更改事件中发生的事情,我只想将自己的事件处理程序添加到该事件中,以便我可以像其他任何事件一样触发一些自定义代码。

5 个答案:

答案 0 :(得分:2)

我知道这个答案迟到了,但希望它最终会对找到这个的人有用。另外,我自己并没有完全想出来。我相信我最初在OpenNETCF板上找到了大部分信息,但下面输入的内容是从我的一个应用程序中提取的。

您可以通过实现OpenNETCF.Windows.Forms.IMessageFilter接口并将其附加到应用程序的消息过滤器来获取mousedown事件。


static class Program {
    public static MouseUpDownFilter mudFilter = new MouseUpDownfilter();
    public static void Main() {
        Application2.AddMessageFilter(mudFilter);
        Application2.Run(new MainForm());
    }
}

这是你可以实现MouseUpDownFilter的方法:


public class MouseUpDownFilter : IMessageFilter {
    List ControlList = new List();

    public void WatchControl(Control buttonToWatch) {
        ControlList.Add(buttonToWatch);
    }

    public event MouseEventHandler MouseUp;
    public event MouseEventHandler MouseDown;

    public bool PreFilterMessage(ref Microsoft.WindowsCE.Forms.Message m) {
        const int WM_LBUTTONDOWN = 0x0201;
        const int WM_LBUTTONUP = 0x0202;

        // If the message code isn't one of the ones we're interested in
        // then we can stop here
        if (m.Msg != WM_LBUTTONDOWN && m.Msg != WM_LBUTTONDOWN) {
            return false;
        }

        //  see if the control is a watched button
        foreach (Control c in ControlList) {
            if (m.HWnd == c.Handle) {
                int i = (int)m.LParam;
                int x = i & 0xFFFF;
                int y = (i >> 16) & 0xFFFF;
                MouseEventArgs args = new MouseEventArgs(MouseButtons.Left, 1, x, y, 0);

                if (m.Msg == WM_LBUTTONDOWN)
                    MouseDown(c, args);
                else
                    MouseUp(c, args);

                // returning true means we've processed this message
                return true;
            }
        }
        return false;
    }
}

现在,当MouseUpDownFilter发生在监视控件(例如文本框)上时,它会触发MouseUp / MouseDown事件。要使用此过滤器,您需要添加一些监视控件并分配给它可能在表单的加载事件中触发的事件:


private void MainForm_Load(object sender, EventArgs e) {
    Program.mudFilter.WatchControl(this.textBox1);
    Program.mudFilter.MouseDown += new MouseEventHandler(mudFilter_MouseDown);
    Program.mudFilter.MouseUp += new MouseEventHandler(mudFilter_MouseUp);
}

void mudFilter_MouseDown(object sender, MouseEventArgs e) {
    if (sender == textBox1) {
        // do what you want to do in the textBox1 mouse down event :)
    }

}

答案 1 :(得分:0)

根据.Net Framework,支持MouseDown Event Handler on a TextBox。当您尝试运行代码时会发生什么?

答案 2 :(得分:0)

足够公平。您可能比我对Windows Mobile了解得多。 :)我刚开始为它编程。但是在常规的WinForms中,您可以根据需要覆盖OnXxx事件处理程序方法。使用CF快速查看Reflector,可以看出Control,TextBoxBase和TextBox不会阻止您覆盖OnMouseDown事件处理程序。

你试过这个吗?:

public class MyTextBox : TextBox
{
    public MyTextBox()
    {
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        //do something specific here
        base.OnMouseDown(e);
    }
}

答案 3 :(得分:0)

看起来你是对的。游民。没有MouseOver事件。

但是,与.NET一起使用的后备之一是P / Invoke。有人已花时间为.NET CF TextBox执行此操作。我在CodeProject上找到了这个:

http://www.codeproject.com/KB/cs/TextBox_subclassing.aspx

希望这有帮助

答案 4 :(得分:0)

是否有可以捕获的“OnEnter”事件?

当你勾选到文本框并通过点击/点击它进入文本框时,它可能也会被捕获,但如果这不是问题,那么这可能是一个更直接的解决方法