捕获 .NET TextBox 的 MouseDown 事件

Capture MouseDown event for .NET TextBox

提问人:Adam Haile 提问时间:8/11/2008 最后编辑:Ijas AmeenudeenAdam Haile 更新时间:1/20/2019 访问量:12673

问:

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

我还尝试了 OpenNETCF TextBox2 控件,它确实公开了 MouseDown 事件,但无论我做什么,它都不会触发处理程序。

有什么建议吗?


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

是的,Windows Mobile 没有实际的鼠标,但您误以为 Windows Mobile .NET 不支持 Mouse 事件。在屏幕上单击或移动仍被视为“鼠标”事件。这样做是为了让代码可以轻松地从完整的 Windows 移植过来。这不是 Windows Mobile 特有的问题。Windows 上的 TextBox 控件也没有本机鼠标事件。在这种情况下,我只是碰巧使用 Windows Mobile。

编辑:顺便说一句......由于 Windows Mobile 是由 WindowsCE 内核构建的,该内核通常用于嵌入式桌面系统和 Slim Terminal Services 客户端或“WinTerms”,因此它支持硬件鼠标,并且已经存在了很长时间。大多数设备只是没有插入端口。


根据 .Net 框架, TextBox 上的 MouseDown 事件处理程序 受支持。当您遇到以下情况时会发生什么 尝试运行代码?

实际上,这只是因为它继承了“Control”,就像其他所有 Form 控件一样。但是,它在 TextBox 类中被重写(我相信并更改为私有)。因此,它不会显示在 Visual Studio 的 IntelliSense 中。

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

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

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

C# .NET 事件 Windows-Mobile

评论

1赞 ageektrapped 8/11/2008
你有什么样的疯狂移动设备有鼠标?:)说真的,没有 MouseDown 事件的原因是 Windows Mobile 没有鼠标。您尝试在 MouseDown 事件处理程序中执行什么操作?也许还有另一种方法。

答:

0赞 GateKiller 8/11/2008 #1

根据 .Net Framework,支持 TextBox 上的 MouseDown 事件处理程序。尝试运行代码时会发生什么情况?

0赞 ageektrapped 8/11/2008 #2

很公平。您可能比我更了解 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);
    }
}
0赞 ageektrapped 8/11/2008 #3

看起来你是对的。无赖。无 MouseOver 事件。

但是,始终适用于 .NET 的回退之一是 P/Invoke。有人已经花时间为 .NET CF TextBox 执行此操作。我在CodeProject上找到了这个:

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

希望这会有所帮助

0赞 dalelane 9/19/2008 #4

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

当您按 Tab 键进入文本框以及通过点击/单击文本框进入文本框时,它可能也会捕获,但如果这不是问题,那么这可能是一种更直接的解决方法

3赞 Frank Razenberg 8/10/2009 #5

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

可以通过实现 OpenNETCF.Windows.Forms.IMessageFilter 接口并将其附加到应用程序的消息筛选器来获取鼠标按下事件。

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

}