質問: タイトルの方法を実現する方法として、 メニューをexeにして、各アプリをDLLにしてメニューから呼び出すという方法が 一つ思い浮かびますが、この場合各アプリ画面でモーダル表示のダイアログ画面を表示している間、 メニュー画面にフォーカスを戻せなくなる問題があると認識しています。 この問題を解決したい場合はやはりメニューのexeと各アプリのexeを分けるしか 方法はないでしょうか? 何かこの問題を回避する方法がありましたらご教示頂ければ幸いです。
回答: `Program.cs`の`Main()`メソッドには ``` Application.Run(new Form1()); ``` のように記述されていると思います。`Application.Run(Form)`.aspx)は引数に渡された`Form`を表示し、その`Form`が閉じられた時点で終了します。この`Application`単位でモーダルダイアログが実現されています。 ところでこの`Application`はプロセス単位ではなくスレッド単位の概念です。ですので、異なるスレッドで起動すれば相互に影響することはありません。 メニュー画面から各アプリ画面を開く際、 ``` var thread2 = new Thread(() => Application.Run(new Form2())); thread2.SetApartmentState(ApartmentState.STA); thread2.Start(); ``` と新たなスレッド上で実行開始してあげれば、メニュー画面はアプリ画面のモーダルの影響をうけなくなります。もちろん、この例での`Form2`が閉じられた時点で`thread2`は終了します。 ### `Application.Exit()`について pgrhoさんが言及されていたので加筆します。`Application.Exit()`.aspx)は > > Exit メソッドは全スレッドで実行中のメッセージ ループをすべて停止し、アプリケーションのウィンドウをすべて閉じます。 > > 現在のスレッドだけのメッセージ ループを終了するには、ExitThread を呼び出します。 > > > と説明されているように全スレッドのメッセージループを停止させるメソッドですから仕様通りの動作をします。また現在のスレッドだけを終了させるためには`Application.ExitThread()`.aspx)を使用すべきとも案内されています。 次善策として`AppDomain`を分離することを提案されていますが、それでもプロセスを終了させる`Enviroment.Exit()`に対しては無力ですし、質問文にあるようにプロセスを分離したとしても`ExitWindowEx()`でPCを止められることもあり得ます。 結局、どこまでを許容するかの話でしかないと思います。