これを行うには、STAスレッドを作成し、を使用Application.Run()
してその別のスレッドからフォームを表示します。他のフォーム用に別のメッセージポンプApplication.Run()
を作成します。これがそれを分離しているものです。
その場合、フォーム間で通信するときは非常に注意する必要があります。Control.Invoke()
最初のフォームから2番目のフォームでUIを変更するメソッドを呼び出すには、またはその他のスレッド間メカニズムを使用する必要があります(その逆も同様です)。
ただし、これを行うと、最初のフォームにモーダルダイアログが表示され、2番目のフォームは引き続きフォーカス可能になります。
それらの間の相対的なZオーダーを指定する方法がないため、2番目のウィンドウが最初のウィンドウの後ろにある可能性があることに注意してください。
2番目のフォームの表示は、次のように実行できます。
private static void ShowIndependentForm()
{
Thread thread = new Thread(ShowIndependentFormImpl);
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
}
private static void ShowIndependentFormImpl()
{
Application.Run(new Form2());
}
必要に応じて、ShowIndependentForm()を呼び出すことができます。おそらく作成後のメインフォームからですが、私のテストコードはMain()
次のようになります。
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ShowIndependentForm();
Application.Run(new Form1());
}
重要
2番目のフォームには独自のメッセージポンプがあるため、Thread.IsBackground
trueに設定しない限り、最初のフォームを閉じてもプログラムは閉じられません。Control.Invoke()
そうしない場合、プログラムを自動的に閉じる場合は、最初のフォームを閉じるときに2番目のフォームを明示的に閉じる必要があります(または他の方法を使用して2番目のフォームのメソッドを呼び出すことによって)。