【问题标题】:How to block mouse click events from another form如何阻止来自另一个表单的鼠标单击事件
【发布时间】:2016-02-28 16:16:49
【问题描述】:

我有一个 winforms 单表单应用程序,它使用我在将新视图加载到应用程序表单时创建的“Thickbox”。
“Thickbox”在应用程序表单前面显示了另一个表单,它是半透明的,并且有一个用户控件,即盒子本身。

这个thickbox可以显示一个模态对话框,在这种情况下我完全没有问题,但它也可以显示为非模态,例如,当用户在主窗体中切换视图时,它会显示thickbox加载动画图标。

问题是当厚框显示为非模式时,它不会阻止用户点击应用程序主窗体的按钮。
当显示thickbox 时,没有任何反应,但一旦关闭,主窗体中相关按钮的单击事件处理程序就会处理单击。

我无法使用ShowDialog,因为我无法阻止 UI 线程,并且我需要从主窗体中获取何时关闭厚框的指示,
我无法设置所有者表单 as described in this answerEnabled 属性(尽管我尝试了此解决方案的各种版本,但没有任何帮助)
我试过使用win API函数BlockInputas descried in this answer,但是没有阻塞输入,
我认为我最好的机会是使用Application.FilterMessage 方法,但我也无法阻止鼠标点击。

如果我可以将鼠标点击阻塞封装在厚框表单本身中,那就太好了,这样它也可以很容易地与其他应用程序一起使用,但是 对调用表单的解决方案也将非常感激。

【问题讨论】:

  • 等等,为什么不能设置所有者表单的Enabled属性?这将是我阅读问题后的建议,并且您不会在这里解释为什么它不起作用。这本质上就是模态对话框正在做的事情,并且应该正是您想要的行为。
  • @CodyGray:这也是我最初的尝试,我确实尝试过这样做,但在我的情况下,这个选项有两个问题:第一个是它延迟了加载的出现图标,第二个是它改变了我在主窗体中的大多数按钮的颜色,并且在关闭厚框后没有足够快地改变它们。我尝试在 form_shown 中,在 userControl 的加载中,甚至在 userControl 的绘制事件中,但没有什么是足够好的......
  • 我不知道为什么会延迟图标的出现。如果没有看到您的代码,我什至不确定这意味着什么。我的猜测是禁用表单会停止加载代码。至于更改按钮的颜色,这是有道理的,因为它会禁用这些按钮,并且禁用的按钮显然看起来不同。如果您在关闭弹出对话框之前重新启用父窗体,则按钮应在弹出对话框关闭时更新。如果没有,您可以通过使表单无效来强制他们重新绘制自己。所以这两个都是代码排序问题。
  • @CodyGray 相信我,我也尝试过...我什至尝试使用异步任务,但似乎没有什么能做得足够好...
  • 真正疯狂的部分是,我现在尝试用新的 winforms 应用程序复制该问题,而且新应用程序似乎工作正常。

标签: c# winforms mouseclick-event


【解决方案1】:

我很高兴地宣布问题终于解决了。
花了几天时间尝试在新应用程序中重新创建此错误,在应用程序中重新构建主窗体,在主应用程序中注释掉部分代码,并且通常只是到处尝试寻找线索,它终于打到我了。
该应用程序的行为就像对厚盒的点击以某种方式排队并且仅在厚盒关闭时才被激活。今天早上,在修复了一些其他错误之后,一分钱终于掉了——我所缺少的只是在关闭厚框表单之前的一行代码:

Application.DoEvents();

烦人的是它对我来说并不是什么新鲜事,在将它包含在主应用程序和厚盒代码本身之前,我已经使用过很多次了......我想我只是不得不放弃一段时间让我的大脑理解事后看来如此痛苦的显而易见的事情......

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多