【问题标题】:Disable mouse hover effect for application禁用应用程序的鼠标悬停效果
【发布时间】:2013-03-23 13:00:21
【问题描述】:

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

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


编辑:

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

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

【问题讨论】:

  • “悬停效果”是什么意思?
  • 我认为该链接会对您有所帮助> stackoverflow.com/questions/2698673/…
  • @zey 我已经用 IMessageFilter 禁用了鼠标点击和键盘输入,我只是想摆脱“悬停”效果
  • @DavidHeffernan 我在描述中添加了一个示例

标签: c# winforms cursor


【解决方案1】:

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

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

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

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

EnableWindow(MyForm.Handle, false); // disable form
EnableWindow(MyForm.Handle, true);  // enable form

【讨论】:

  • 谢谢,我也玩了一点,但问题是我的应用程序处理多个表单以及我需要启用/禁用的多个线程。因此,我需要跟踪所有表单并执行Invoke 以获取所有表单句柄,这让我感到害怕。如果可能的话,我不想进入 GUI 线程问题
  • 这些问题与此无关。由于您需要应用应用程序范围的更改,因此无论如何您都需要处理这些问题。
  • 关于禁用鼠标/键盘,我不必(至少从开发人员的角度来看)。我只需将IMessageFilter 的实现实例添加到我的应用程序消息过滤器Application.AddMessageFilter()。我希望对于“悬停”效果也有这样的解决方案......以某种方式操纵光标左右......
  • 很好。因此,您只需找到一种方法来完成其余的工作。祝你好运!
【解决方案2】:

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

 protected override void OnMouseEnter(EventArgs e)
 {
     if (shouldBeEnabled)
     {
         base.OnMouseEnter(e);
     }
 }

【讨论】:

  • 我不想要按钮,而是所有能够处理鼠标悬停事件的控件
  • 好的。我认为您不想自己创建所有类,所以这是最简单的方法。在窗体的 OnLoad 方法中,循环遍历其所有子控件,然后删除 OnMouseEnter 事件并添加您的自定义事件。此或覆盖您正在使用的所有 UI 控件的处理程序。
  • 嗯,这是个好主意,但想在应用程序运行时按需禁用和启用它...
  • 像我之前说的那样添加自定义事件,并在基本方法周围添加一个布尔条件。检查更新。
  • 但是如果表单已经加载并且我想在它打开时禁用它怎么办?您描述的方法仅在加载表单时调用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 2016-04-26
  • 2013-05-06
  • 1970-01-01
  • 2018-11-05
  • 2010-12-04
相关资源
最近更新 更多