Um formulário pode informar se existem janelas modais abertas?

Como, estando dentro da forma principal do meu aplicativo WinForm, posso saber se existem janelas / diálogos modais que pertençam ao formulário principal?

if (this.Visible && !this.CanFocus) { // modal child windows are open } 

Longa história curta: abrir um formulário modal é a execução de blocos no formulário principal, desde que a janela modal esteja aberta, portanto, o formulário principal nunca poderá verificar se abriu algum formulário modal até que o formulário modal seja fechado . Em outras palavras, sua pergunta é baseada em um mal-entendido de como os formulários modais funcionam, de modo que é totalmente discutível.

Para que vale a pena, é possível dizer se há algum formulário modal aberto:

 foreach (Form f in Application.OpenForms) { if (f.Modal) { // do stuff } } 

Você talvez possa usar os events para EnterThreadModal e LeaveThreadModal . Aqui está um exemplo de como você pode fazer isso:

 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.EnterThreadModal += new EventHandler(Application_EnterThreadModal); Application.LeaveThreadModal += new EventHandler(Application_LeaveThreadModal); Application.Run(new Form1()); } private static void Application_EnterThreadModal(object sender, EventArgs e) { IsModalDialogOpen = true; } private static void Application_LeaveThreadModal(object sender, EventArgs e) { IsModalDialogOpen = false; } public static bool IsModalDialogOpen { get; private set; } } } 

Se você usar o Google um pouco, descobrirá que Form.ShowDialog () desabilita outros formulários para impedir que o usuário insira esses formulários do atual. Mas quase todo o resto (como timers e outros events de fonts externas ao formulário exibido) continua a ser executado.

Timers ainda funcionam e triggersm events.
Exemplo que funciona …

 public partial class Form1 : Form { Form2 f2 = new Form2(); public Form1() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { f2.UpdateData(DateTime.Now.ToString()); if (!f2.Visible) f2.ShowDialog(); } private void button1_Click(object sender, EventArgs e) { f2.ShowDialog(); MessageBox.Show("Done"); } }