0

有没有办法为 winforms 应用程序的所有控件禁用鼠标悬停效果?我知道你可以通过循环所有控件来做到这一点,但我宁愿在应用程序级别上做到这一点。

背景是,我想禁用整个应用程序的输入(我通过IMessageFilter)。用户应该仍然能够移动鼠标但不能单击它。这工作得很好,但是控件上的悬停效果仍然存在。


编辑:

例如,如果您将鼠标移到一个按钮上,则表示一旦鼠标移到该控件上,您就可以单击它

该应用程序由多个可能的打开表单组成,每个表单都可以启动一个后台工作者(线程),我需要从中控制应用程序的行为。所以我真的很想避免弄乱 GUI 线程问题。

4

2 回答 2

0

您可以从创建自己的按钮类开始并覆盖 MouseEnter 事件:

 protected override void OnMouseEnter(EventArgs e)
 {
     if (shouldBeEnabled)
     {
         base.OnMouseEnter(e);
     }
 }
于 2013-04-02T09:40:26.080 回答
0

在我看来,您只是想禁用顶级窗口。这将解决您的所有问题并消除对IMessageFilter代码的需求。你最终会得到极少量的代码。

您需要 p/invokeEnableWindow来自 user32 的 API 调用:

[DllImport("user32.dll")]
static extern bool EnableWindow(IntPtr hWnd, bool bEnable);

然后,您可以像这样控制表单的可用性:

EnableWindow(MyForm.Handle, false); // disable form
EnableWindow(MyForm.Handle, true);  // enable form
于 2013-04-02T13:09:50.090 回答