【问题标题】:Get current MessageBox获取当前消息框
【发布时间】:2020-03-03 17:21:16
【问题描述】:

我有一个包含多个表单的大型应用程序,它们中的任何一个都可以获得一个模态的 MessageBox (MessageBox.Show()) 并锁定表单。

在激活另一个表单时,我现在需要找到此 MessageBox 并将包含此 MessageBox 的表单放在前面。有什么方法可以检查吗?

我知道Application.OpenForms 属性,也许MessageBox 有类似的东西?

Edit1 : 比如我们打开 Winform1,那么 Winform1 中的一个事件会去打开 Winform2 的 mainController。后来 Winform1 得到了一个 MessageBox.Show,但它完全有可能将 Winform2 带到前面(在 Winform1 之上)。所以现在我需要对 Winform.Activated 做出反应,检查是否有任何 MessageBox.Show,如果有,请将这个保存 MessageBox 的表单放在前面。

【问题讨论】:

  • 我很困惑。如果消息框是模态且打开的,则不应打开或激活其他表单...
  • @MerlynMorgan-Graham:第一个锁定的表单肯定不是从他的应用程序中打开表单的唯一方法。
  • @Otiel:除非在后台弹出表单,否则应该锁定所有表单,因此无法弹出表单以响应用户。我以为这就是 modal 的意思——所有表单都被锁定了。
  • @MerlynMorgan-Graham:不一定。例如,如果从系统托盘菜单打开表单,则从表单打开MessageBox 不会阻止打开另一个表单。不过,“将包含此 MessageBox 的表单放在前面”肯定是不可能的。
  • 您可能能够找到活动表单的父表单(拥有消息框的表单),并将新表单设置为该表单后面的 z 顺序。不知道这是多么痛苦,或者有多大可能。

标签: c# .net winforms


【解决方案1】:

您可以像这样使用Application.OpenForms 找到它们:

foreach (Form f in Application.OpenForms)
{
    if (f.Visible && ! f.CanFocus)
    {
        // whatever...
    }
}

或者:完全使用不同的方法:

让您的所有表单都处理 Application.EnterThreadModalApplication.LeaveThreadModal,这样当应用程序在该表单处于当前状态时进入模态时,您可以将该表单添加到列表中以便您可以跟踪它,并将其从列表中删除当它离开模态时......

那么您需要做的就是查询该列表以查看是否有任何表单打开了模式对话框。

【讨论】:

  • 这不包含为 MessageBox.Show 创建的表单?我已经检查过了,无论是否显示 MessageBox,我的 Application.OpenForms.Count 都是相同的。
  • 啊哈,Application.OpenForms 似乎不可靠(即使显示主窗体,它在我当前的应用程序上也显示为 0)查看错误的详细信息:stackoverflow.com/questions/3751554/… 也许如果你可以以不同的方式循环浏览表单,然后使用 (f.Visible && ! f.CanFocus)...?
  • 您对我在编辑中建议的第二种方法有什么好处吗?
  • 我可能会将所有 MessageBox.Show 切换到我自己的对话框处理程序,该处理程序以对话框形式打开一个小的 winform。只要 Application.OpenForms 的错误没有发挥作用,这将使 Application.OpenForms 工作。
  • 通过您自己的函数推送所有消息显示显然是最简单的方法,因为您可以自己跟踪对话框而不依赖 Application.OpenForms。我只是假设您想避免这种解决方案 - 以防 MessageBox.Show() 由于健忘或其他人更改您的代码而意外出现在某处......无论如何,您现在有一系列选择。一切顺利。
【解决方案2】:

尝试使用获取所有者的Show 方法之一:

MessageBox.Show(this, "My Message");

我在 .NET 4 / Windows 7 上对此进行了测试,当打开消息框时,它会将其所有者带到最前面。

【讨论】:

    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 2017-04-06
    • 2015-08-24
    • 2012-02-11
    相关资源
    最近更新 更多