C#Winforms抑制文本框上的鼠标单击事件
我在Winforms应用程序上有一个多行文本框,我希望能够在应用程序的某些状态下单击该文本框,而无需更改文本选择 我仍然希望订阅MouseDown(或Click)事件,我只是不希望文本选择对其作出反应 我希望在MouseEventArgs上有一个被处理或取消的财产,但遗憾的是,没有C#Winforms抑制文本框上的鼠标单击事件,c#,winforms,events,C#,Winforms,Events,我在Winforms应用程序上有一个多行文本框,我希望能够在应用程序的某些状态下单击该文本框,而无需更改文本选择 我仍然希望订阅MouseDown(或Click)事件,我只是不希望文本选择对其作出反应 我希望在MouseEventArgs上有一个被处理或取消的财产,但遗憾的是,没有 我可以收听选择更改事件,并在需要时尝试重置它,但这感觉有点像黑客,因为我必须在选择更改事件之前记住当前选择。有人有比这更好的建议吗?在其上方放置一个透明面板。如何处理Enter事件并在此事件中将焦点设置为其他控件?不
我可以收听选择更改事件,并在需要时尝试重置它,但这感觉有点像黑客,因为我必须在选择更改事件之前记住当前选择。有人有比这更好的建议吗?在其上方放置一个透明面板。如何处理
Enter
事件并在此事件中将焦点设置为其他控件?不过还是相当“黑客式”,只需更少的代码。您可以从System.Windows.Forms.Textbox继承创建自己的文本框,然后覆盖WndProc
WndProc是最初的方法,它接收来自操作系统、电源消息、输入等的所有消息。该方法的名称是追溯到Win32(和Win16)时代,您将实现的两个主要功能之一是“WndProc”或Windows过程
通过这样做,您现在可以在将事件发送到基本实现之前拦截鼠标的windows消息(或任何其他消息)
在下面的示例中,我们不会将任何左键向下、向上或双击传递给要处理的基本控件
public partial class MyTextBox : TextBox
{
int WM_LBUTTONDOWN = 0x0201; //513
int WM_LBUTTONUP = 0x0202; //514
int WM_LBUTTONDBLCLK = 0x0203; //515
public MyTextBox()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_LBUTTONDOWN ||
m.Msg == WM_LBUTTONUP ||
m.Msg == WM_LBUTTONDBLCLK // && Your State To Check
)
{
//Dont dispatch message
return;
}
//Dispatch as usual
base.WndProc(ref m);
}
}
唯一要做的就是添加状态检查,以确定何时传递消息
您可以找到一个要处理的Windows消息列表。我也考虑过,但它同样让人感觉很笨拙。可能比回滚选择更改事件更简单,尽管透明的背景色似乎不起作用。我可能会错过一些东西,虽然它很难看,但它似乎是有效的,我只需要在关注一个虚拟的空标签后,将我的功能移到enter事件。不过,我还不会接受这个答案,除非我没有得到更好的建议,谢谢,实际上没有,因为我需要鼠标事件参数。该死的,我不怪你还没接受。我正在看这一个,看看是否有人有更好的想法:)非常好,谢谢,我知道我必须钻到.Net堆栈下面,但仍然没有得到鼠标事件参数,但我喜欢这个解决方案,可以解决这个问题。你可以在文本框中添加一个额外的事件,在其中传递鼠标事件参数,并在表单中使用相同的事件处理程序。这样可以绕过默认的鼠标处理实现。