捕获 .NET TextBox 的 MouseDown 事件
-
08-06-2019 - |
题
有没有办法甚至从 .NET 2.0 TextBox 控件中捕获 MouseDown?我知道继承的 Control 类有该事件,但它没有在 TextBox 中公开。有没有办法覆盖事件处理程序?
我还尝试了 OpenNETCF TextBox2 控件,该控件确实公开了 MouseDown 事件,但无论我做什么,它都不会触发处理程序。
有什么建议么?
您有哪种疯狂的移动设备有鼠标?:)
是的,Windows Mobile 没有实际的鼠标,但您错误地认为 Windows Mobile .NET 不支持鼠标事件。屏幕上的单击或移动仍被视为“鼠标”事件。这样做是为了让代码可以轻松地从完整的 Windows 移植过来。这不是 Windows Mobile 特有的问题。Windows 上的 TextBox 控件也没有本机鼠标事件。在这种情况下,我恰好使用的是 Windows Mobile。
编辑:顺便说一句...由于 Windows Mobile 是由 WindowsCE 核心构建的,该核心通常用于嵌入式桌面系统和 Slim 终端服务客户端或“WinTerms”,因此它支持硬件鼠标并且已经存在很长时间了。大多数设备只是没有可插入的端口。
根据.NET框架,支持文本框上的Mousedown事件处理程序。当您尝试运行代码时会发生什么?
实际上,这只是因为它继承自“Control”,就像 每一个 其他表单控件。然而,它在 TextBox 类中被重写(我相信并更改为私有)。因此它不会显示在 Visual Studio 的 IntelliSense 中。
然而,你实际上可以编写代码:
textBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseDown);
它会编译并运行得很好,唯一的问题是当您点击 TextBox 控件时,textBox1_MouseDown() 不会被触发。我认为这是因为事件被内部覆盖。我什至不想更改事件内部发生的情况,我只想将自己的事件处理程序添加到该事件中,这样我就可以像处理任何其他事件一样触发一些自定义代码。
解决方案
看来你是对的。真糟糕。没有 MouseOver 事件。
不过,始终适用于 .NET 的后备方案之一是 P/Invoke。有人已经花时间为 .NET CF TextBox 执行此操作。我在 CodeProject 上找到了这个:
http://www.codeproject.com/KB/cs/TextBox_subclassing.aspx
希望这可以帮助
其他提示
我知道这个答案已经太晚了,但希望它最终对发现这个的人有用。而且,这也不是我自己想出来的。我相信我最初在 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; } }
现在,当 MouseUp/MouseDown 事件发生在监视的控件(例如文本框)上时,此 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 :) } }
很公平。您可能比我更了解 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);
}
}
您是否可以捕获“OnEnter”事件?
当您使用 Tab 键进入文本框以及通过点击/单击输入文本框时,它可能也会捕获,但如果这不是问题,那么这可能是一个更简单的解决方法
根据 .Net 框架, 文本框上的 MouseDown 事件处理程序 是支持的。当您尝试运行代码时会发生什么?