Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取当前消息框_C#_.net_Winforms - Fatal编程技术网

C# 获取当前消息框

C# 获取当前消息框,c#,.net,winforms,C#,.net,Winforms,我有一个包含多个表单的大型应用程序,其中任何一个都可以获得一个模式化的MessageBox(MessageBox.Show())并锁定表单 在激活另一个表单时,我现在需要找到此MessageBox,并将包含此MessageBox的表单放在前面。有没有办法检查一下 我知道应用程序.OpenForms属性,也许MessageBox有类似的东西 Edit1:例如,假设我们打开Winform1,那么Winform1中的事件将转到打开Winform2的主控制器。Lateron Winform1获得了一个M

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

在激活另一个表单时,我现在需要找到此
MessageBox
,并将包含此
MessageBox
的表单放在前面。有没有办法检查一下

我知道
应用程序.OpenForms
属性,也许
MessageBox
有类似的东西


Edit1:例如,假设我们打开Winform1,那么Winform1中的事件将转到打开Winform2的主控制器。Lateron Winform1获得了一个MessageBox.Show,但完全可以将Winform2放在前面(Winform1之上)。所以现在我需要对Winform.Activated做出反应,检查是否有MessageBox.Show,如果有,请将这个保存MessageBox的表单放在前面。

您可以通过如下方式找到它们:

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

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

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


然后,您只需查询该列表,查看是否有任何表单打开了模式对话框。

您可以使用以下方法找到它们:

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

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

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

然后,您只需查询该列表,查看是否有任何表单打开了模式对话框。

尝试使用以下方法之一:

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

尝试使用以下方法之一:

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


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

我感到困惑。如果消息框处于模式且打开状态,则不应打开或激活其他表单…@MerlynMorgan Graham:第一个锁定的表单肯定不是从其应用程序中打开表单的唯一方法。@Otiel:除非后台有东西弹出表单,否则应锁定所有表单,因此无法弹出表单响应用户。我想这就是莫代尔的意思——所有的表单都是锁定的。@MerlynMorgan-Graham:不一定。例如,如果表单是从systray菜单打开的,则从表单打开
MessageBox
不会阻止打开另一个表单。不过,“将具有此MessageBox的表单放在前面”肯定是不可能的。您可能可以找到活动表单的父级(拥有MessageBox的表单),并将新表单设置为该表单后面的z顺序。我不知道这有多痛苦,也不知道这有多可能。我很困惑。如果消息框处于模式且打开状态,则不应打开或激活其他表单…@MerlynMorgan Graham:第一个锁定的表单肯定不是从其应用程序中打开表单的唯一方法。@Otiel:除非后台有东西弹出表单,否则应锁定所有表单,因此无法弹出表单响应用户。我想这就是莫代尔的意思——所有的表单都是锁定的。@MerlynMorgan-Graham:不一定。例如,如果表单是从systray菜单打开的,则从表单打开
MessageBox
不会阻止打开另一个表单。不过,“将具有此MessageBox的表单放在前面”肯定是不可能的。您可能可以找到活动表单的父级(拥有MessageBox的表单),并将新表单设置为该表单后面的z顺序。但不确定这有多痛苦,或者这有多可能。这无法保存为MessageBox.Show创建的表单?我已经检查过了,我的Application.OpenForms.Count是相同的,不管MessageBox是否显示。啊哈,似乎Application.OpenForms不可靠(在我当前的应用程序中,即使主窗体显示,它也会显示0)。请查看此错误的详细信息:如果您可以以不同的方式循环浏览表单,请使用(f.Visible&!f.CanFocus)…?您对我在编辑中建议的第二种方法是否有任何运气?我可能会切换所有MessageBox.Show到我自己的对话框处理程序,该处理程序以对话框形式打开一个小winform。这将使appliation.OpenForms工作,只要Application.OpenForms中的错误没有出现。通过您的wn函数显然是最简单的方法,因为您可以自己跟踪对话框,而无需依赖Application.OpenForms。我只是假设您希望避免使用此解决方案-以防出现MessageBox.Show()由于健忘或其他人更改了您的代码而意外出现在某个地方…无论如何,您现在有了一系列选项。最好的情况是。这不包含为MessageBox.Show创建的表单?我已选中,并且无论MessageBox是否显示,我的Application.OpenForms.Count都是相同的。啊哈,似乎是Application.OpenForms不可靠(在我当前的应用程序上显示0,尽管主窗体正在显示)请查看此处以了解错误的详细信息:如果您可以以不同的方式循环浏览这些窗体,请使用(f.Visible&&!f.CanFocus)…?您对我在编辑中建议的第二种方法是否有任何运气?我可能会切换所有MessageBox.Show到我自己的对话框处理程序,该处理程序以对话框形式打开一个小winform。这将使appliation.OpenForms工作,只要Application.OpenForms中的错误没有出现。通过您的wn函数显然是最简单的方法,因为您可以自己跟踪对话框,而无需依赖Application.OpenForms