C# 是否可以禁用控件,但仍接收该控件的事件?

C# 是否可以禁用控件,但仍接收该控件的事件?,c#,winforms,C#,Winforms,在windows窗体中,我有一个简单的文本框: TextBox textBox = new TextBox() { Text = "text" }; textBox.Enabled = false; textBox.MouseEnter += (object sender, EventArgs e) => { MessageBox.Show("MOUSE ENTERED"); // this never fires if the control is disabled. }; 我

在windows窗体中,我有一个简单的文本框:

TextBox textBox = new TextBox() { Text = "text" };
textBox.Enabled = false;
textBox.MouseEnter += (object sender, EventArgs e) =>
{
    MessageBox.Show("MOUSE ENTERED"); // this never fires if the control is disabled.
};
我想禁用用户与控件交互的能力,并且我想将控件样式设置为禁用控件。但我还希望从控件接收
MouseEnter
MouseLeave
Click
事件,以便在悬停时更改控件的背景封面,并对控件上的单击作出响应


但正如我刚刚发现的,如果禁用windows窗体控件,它也会禁用事件。我知道,通过一些努力,我可以通过全局检查鼠标坐标来完成同样的事情,但是如果我可以禁用它,但仍然可以接收它的事件,那会更好。这可能吗?

启用的在Windows窗体本身并没有任何作用。通常,禁用的窗口不会接收输入消息(如鼠标事件和键盘事件),这是windows控件的一个属性。因此,不,您无法禁用控件并仍然接收这些消息。Windows在Windows上就是不能这样工作。不是
TextBox
控件过滤掉这些消息-它们不是第一个出现的

TextBox
是一个很好的windows通用控件包装器。当您执行类似于
tbx.Text=“Hello”的操作时
文本框
只向该公共控件发送一条消息,说“将文本更改为Hello”。如果您想改变这一点,您需要从头开始创建控件。您可以进行一些黑客攻击,以恢复普通控件作为鼠标事件响应所做的任何操作,但这些操作通常不太有效,并且往往会以意外的方式崩溃

实际上,您真正想要的可能是调整
ReadOnly
的行为方式(例如,禁用焦点以及使控件只读,但这同样只是一个肮脏的黑客行为),或者用一个控件替换
TextBox
,该控件可以是控件或标签,允许您在两者之间切换。如果希望文本框停止作为文本框的行为,请停止作为文本框。问题已解决:)


不过,我还是会重新考虑使用
只读
。您确定用户不想在文本框中选择文本并将其复制到其他位置吗?或者更改阅读顺序?

启用的
在Windows窗体本身并没有任何作用。通常,禁用的窗口不会接收输入消息(如鼠标事件和键盘事件),这是windows控件的一个属性。因此,不,您无法禁用控件并仍然接收这些消息。Windows在Windows上就是不能这样工作。不是
TextBox
控件过滤掉这些消息-它们不是第一个出现的

TextBox
是一个很好的windows通用控件包装器。当您执行类似于
tbx.Text=“Hello”的操作时
文本框
只向该公共控件发送一条消息,说“将文本更改为Hello”。如果您想改变这一点,您需要从头开始创建控件。您可以进行一些黑客攻击,以恢复普通控件作为鼠标事件响应所做的任何操作,但这些操作通常不太有效,并且往往会以意外的方式崩溃

实际上,您真正想要的可能是调整
ReadOnly
的行为方式(例如,禁用焦点以及使控件只读,但这同样只是一个肮脏的黑客行为),或者用一个控件替换
TextBox
,该控件可以是控件或标签,允许您在两者之间切换。如果希望文本框停止作为文本框的行为,请停止作为文本框。问题已解决:)


不过,我还是会重新考虑使用
只读
。您确定用户不想在文本框中选择文本并将其复制到其他位置吗?或者更改阅读顺序?

可能是您想要
textBox
be
textBox.ReadOnly=true
(而不是
Enabled=false;
)?令人烦恼的是,它仍然允许您将光标放在文本框中。它就是不允许你打字。这样做时,它也没有禁用的样式。实际上,一个标签可能工作得太久,只要它看起来或多或少相同。我现在正在尝试。我仍然希望只在文本框中接收事件。meh,一个带有
AutoSize=true
BorderStyle=BorderStyle.fixedsSingle
的标签也一样好。这就是我的答案。只需使用标签。这一次我很幸运,但如果我真的需要在文本框中显示这些事件,那我就麻烦了。我非常感谢@DmitryBychenko的评论,但它得到了很多支持票,我想提醒大家,它没有回答问题,也没有提供可行的替代方案。谢谢你的建议!可能是您想要
textBox
be
textBox.ReadOnly=true
(而不是
Enabled=false;
)?令人烦恼的是,它仍然允许您将光标放在文本框中。它就是不允许你打字。这样做时,它也没有禁用的样式。实际上,一个标签可能工作得太久,只要它看起来或多或少相同。我现在正在尝试。我仍然希望只在文本框中接收事件。meh,一个带有
AutoSize=true
BorderStyle=BorderStyle.fixedsSingle
的标签也一样好。这就是我的答案。只需使用标签。这一次我很幸运,但如果我真的需要在文本框中显示这些事件,那我就麻烦了。我非常感谢@DmitryBychenko的评论,但它得到了很多支持票,我想提醒大家,它没有回答问题,也没有提供可行的替代方案。谢谢你的建议!它实际上只是一个显示小部件。我不确定标签上的边框会是什么样子,但如果你给标签加上边框,它看起来和禁用的Te几乎一样