提问人:Adam Haile 提问时间:8/11/2008 最后编辑:Ijas AmeenudeenAdam Haile 更新时间:1/20/2019 访问量:12673
捕获 .NET TextBox 的 MouseDown 事件
Capture MouseDown event for .NET TextBox
问:
有没有办法从 .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()。我认为这是因为事件在内部被覆盖。我什至不想在内部更改事件上发生的事情,我只想将我自己的事件处理程序添加到该事件中,以便我可以像使用任何其他事件一样触发一些自定义代码。
答:
根据 .Net Framework,支持 TextBox 上的 MouseDown 事件处理程序。尝试运行代码时会发生什么情况?
很公平。您可能比我更了解 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);
}
}
看起来你是对的。无赖。无 MouseOver 事件。
但是,始终适用于 .NET 的回退之一是 P/Invoke。有人已经花时间为 .NET CF TextBox 执行此操作。我在CodeProject上找到了这个:
http://www.codeproject.com/KB/cs/TextBox_subclassing.aspx
希望这会有所帮助
是否有可以捕获的“OnEnter”事件?
当您按 Tab 键进入文本框以及通过点击/单击文本框进入文本框时,它可能也会捕获,但如果这不是问题,那么这可能是一种更直接的解决方法
我知道这个答案已经很晚了,但希望它最终对发现这个答案的人有用。另外,我自己并没有完全想出它。我相信我最初在 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 :) } }
评论