表格可以判断是否有任何模态窗口打开?

如何,在我的WinForm应用程序的主要forms内,我可以判断是否有任何模态窗口/对话框打开属于主窗体?

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

简而言之:只要模态窗口打开,打开模态窗体就是在主窗体上执行块,因此在模态窗体关闭之前 ,您的主窗体永远无法检查它是否打开了任何模态窗体 。 换句话说,你的问题是基于对模态forms如何运作的误解,所以它完全没有实际意义。

为了它的价值,可以判断是否有任何模态forms打开:

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

您可以将事件用于EnterThreadModalLeaveThreadModal 。 以下是如何执行此操作的示例:

 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; } } } 

如果你有点谷歌,你会发现Form.ShowDialog()禁用其他forms,以防止用户输入当前forms的那些forms。 但大多数其他东西(如计时器和显示forms外部来源的其他事件)继续运行。

计时器仍在运行并发射事件。
有效的例子……

 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"); } }