2011-11-17 94 views
2

我有一个很大的应用程序与几种形式,他们中的任何人都可以得到一个MessageBoxMessageBox.Show())模态并锁定窗体。获取当前消息框

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

我知道Application.OpenForms属性,也许有这样的MessageBox

编辑1:例如,假设我们打开Winform1,Winform1中的事件将转到打开Winform2的mainController。 Lateron Winform1得到了一个MessageBox.Show,但它完全可以将Winform2放在前面(在Winform1之上)。所以现在我需要对Winform.Activated做出反应来检查是否有任何MessageBox.Show,如果是,请将保存MessageBox的表单放在前面。

+4

我很困惑。如果消息框是模态的并且打开,那么没有其他窗体应该打开或激活... –

+0

@ MerlynMorgan-Graham:第一个锁定窗体当然不是从他的应用程序打开窗体的唯一方法。 – Otiel

+0

@Otiel:除非背景中的某些内容弹出窗体,否则* all *窗体应该被锁定,因此无法弹出表单以响应用户。我认为这就是模态意味着什么 - 所有形式都被锁定。 –

回答

1

你可以做这样的事情找到他们:

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

道歉,如果语法错了,我不嘘C#...

编辑:怎么样了不同的方法完全?

使所有表单处理Application.EnterThreadModal和Application.LeaveThreadModal,以便当应用程序在该表单处于最新状态时变为模态时,将该表单添加到列表中,以便您可以跟踪该表单并将其从列出它何时离开模态...然后,您只需查询该列表,查看是否有任何窗体打开了模态对话框。

+0

这不包含为MessageBox.Show创建的表单吗?我已检查并且我的Application.OpenForms.Count是相同的,而不管MessageBox是否显示。 – Banshee

+0

啊哈,它似乎Application.OpenForms是不可靠的(即使主窗体的显示,它显示0我在我的当前应用程序)查看bug的详细信息:http://stackoverflow.com/questions/3751554/application -openforms-count-0-always也许如果你可以以不同的方式循环表单,然后使用(f.Visible &&!f.CanFocus)...? – andyhasit

+0

您对我在编辑中建议的第二种方法有什么好运气吗? – andyhasit

0

尝试使用的Show方法,其采用所有者之一:

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

我上.NET 4 /视窗7进行了测试,在打开消息框,当它带来了其拥有者向前方。