如何阻止来自其他窗体的鼠标单击事件

本文关键字:鼠标 单击 事件 窗体 其他 何阻止 | 更新日期: 2023-09-27 18:36:40

我有一个winforms单表单应用程序,每当将新视图加载到应用程序表单中时,它都会使用我创建的"厚箱"。
"Thickbox"在应用程序的窗体前面显示另一个窗体,该窗体是半透明的,并且具有一个用户控件,即框本身。

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

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

我无法使用ShowDialog,因为我无法阻止 UI 线程,我需要从主窗体中获取何时关闭厚箱的指示,
我无法按照此答案中所述设置所有者表单的Enabled属性(尽管我已经尝试了此解决方案的各种版本,但没有任何帮助)
我尝试使用BlockInput win API 函数,如本答案中所述,但这并没有阻止输入,
我认为我最好的机会是使用 Application.FilterMessage 方法,但我也无法阻止鼠标点击。

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

如何阻止来自其他窗体的鼠标单击事件

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

Application.DoEvents();

烦人的是,它对我来说并不新鲜,在包含在主应用程序和厚框代码本身之前,我已经多次使用它......我想我只需要放手一段时间,让我的大脑理解事后看来如此痛苦的事情......