为 .NET TextBox 捕获 MouseDown 事件

Posted

技术标签:

【中文标题】为 .NET TextBox 捕获 MouseDown 事件【英文标题】:Capture MouseDown event for .NET TextBox 【发布时间】:2010-09-05 16:22:55 【问题描述】:

是否有任何方法可以从 .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 事件处理程序 支持。当你 尝试运行代码?

实际上,这只是因为它从“控件”继承它,每个其他表单控件也是如此。但是,它在 TextBox 类中被覆盖(并且我相信已更改为私有)。所以它不会出现在 Visual Studio 的 IntelliSense 中。

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

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

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

【问题讨论】:

你有什么样的疯狂移动设备,有鼠标? :) 说真的,没有 MouseDown 事件的原因是因为 Windows Mobile 没有鼠标。你想在 MouseDown 事件处理程序中做什么?也许还有其他方法。 【参考方案1】:

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

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

静态类程序 公共静态 MouseUpDownFilter mudFilter = new MouseUpDownfilter(); 公共静态无效主要() Application2.AddMessageFilter(mudFilter); Application2.Run(new MainForm());

这是实现 MouseUpDownFilter 的方法:

公共类 MouseUpDownFilter : IMessageFilter 列表控制列表 = 新列表(); 公共无效WatchControl(控制buttonToWatch) ControlList.Add(buttonToWatch); 公共事件 MouseEventHandler MouseUp; 公共事件 MouseEventHandler MouseDown; 公共布尔 PreFilterMessage(参考 Microsoft.WindowsCE.Forms.Message m) 常量 int WM_LBUTTONDOWN = 0x0201; 常量 int WM_LBUTTONUP = 0x0202; // 如果消息代码不是我们感兴趣的代码之一 // 那么我们可以在这里停下来 if (m.Msg != WM_LBUTTONDOWN && m.Msg != WM_LBUTTONDOWN) 返回假; // 查看控件是否为被监视按钮 foreach (ControlList 中的控制 c) if (m.HWnd == c.Handle) int i = (int)m.LParam; 诠释 x = 我 & 0xFFFF; int y = (i >> 16) & 0xFFFF; MouseEventArgs args = new MouseEventArgs(MouseButtons.Left, 1, x, y, 0); if (m.Msg == WM_LBUTTONDOWN) MouseDown(c, args); 别的 MouseUp(c, args); // 返回 true 表示我们已经处理了这条消息 返回真; 返回假;

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

私人无效MainForm_Load(对象发送者,EventArgs e) Program.mudFilter.WatchControl(this.textBox1); Program.mudFilter.MouseDown += new MouseEventHandler(mudFilter_MouseDown); Program.mudFilter.MouseUp += new MouseEventHandler(mudFilter_MouseUp); void mudFilter_MouseDown(对象发送者,MouseEventArgs e) 如果(发件人 == textBox1) // 在 textBox1 鼠标按下事件中做你想做的事情 :)

【讨论】:

【参考方案2】:

看来你是对的。真可惜。没有 MouseOver 事件。

不过,始终适用于 .NET 的备用方案之一是 P/Invoke。已经有人花时间为 .NET CF TextBox 做这件事了。我在 CodeProject 上找到了这个:

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

希望对你有帮助

【讨论】:

【参考方案3】:

很公平。您可能比我更了解 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);
    

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于为 .NET TextBox 捕获 MouseDown 事件的主要内容,如果未能解决你的问题,请参考以下文章

asp.net中如何判断input#textbox内容为空

asp.net 判断用户在Textbox里输入是不是为整数

TextBox 日期控件 - 日期格式自定义 asp.net

.NET ------- 通过事件控制textbox 显示隐藏,以及textbox 常用属性

ASP.NET textbox控件 怎么控制输入的必须是数字 且不能为中文

vb.net中textbox的size属性值无法赋值