winforms – 当模式对话框处于活动状态时,阻止任务栏激活非模态窗体

当任何对话框是模态的时候,我想阻止在winforms应用程序中激活所有其他表单.这就是Outlook的操作方式 – 打开两封新邮件,从一条邮件打开通讯簿,您无法使用任务栏或单击邮件窗口激活其他邮件.如何在winforms应用程序中执行此操作(请注意,设置所有权不起作用)?

以下示例应用.

using System.Drawing;
using System.Windows.Forms;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         Application.Run(new MainForm());
      }
   }

   public class MainForm : Form
   {
      public MainForm()
      {
         Text = "Main Form";
         var button = new Button{Text = "New form"};
         button.Click += (sender, args) => new Form2().Show();
         //button.Click += (sender, args) => { var form = new Form2(); AddOwnedForm(form); form.Show(); };
         Controls.Add(button);
         button.Location = new Point(20, 20);
      }
   }

   public class Form2 : Form
   {
      public Form2()
      {
         Text = "Form 2";
         var button = new Button{Text = "New modal form"};
         button.Click += (sender, args) => new Form{Text = "Modal Dialog", ShowInTaskbar = false}.ShowDialog();
         Controls.Add(button);
         button.Location = new Point(20, 20);
      }
   }
}

若要重现该行为,请运行该应用程序,打开两个Form2实例,然后从第二个实例打开一个模式对话框.然后使用任务栏激活第一个Form2实例,它出现在模式对话框上方.

更新:这个与WPF Windows的repros也是如此.

更新:根据Hans的反馈,这似乎是一个错误,我已将此报告给connect.microsoft.com here.

最佳答案
我责备,Win7.除了使这些表单拥有之外,我没有看到明显的解决方法,因此他们不需要任务栏按钮. Windows窗口管理器允许禁用的窗口变为活动状态非常奇怪.这不会经常进行测试,让一个应用程序占用这么多任务栏按钮非常不寻常.

转载注明原文:winforms – 当模式对话框处于活动状态时,阻止任务栏激活非模态窗体 - 代码日志