C#winformアプリケーションがあり、その作業中に別のWinformプロセスが開かれています。他のプロセスには独自のUIがあります。 親アプリケーションを閉じると、他のアプリケーションを自動的に終了します。アプリケーション終了時に別のプロセスを閉じる
どうすれば実現できますか?
おかげ
C#winformアプリケーションがあり、その作業中に別のWinformプロセスが開かれています。他のプロセスには独自のUIがあります。 親アプリケーションを閉じると、他のアプリケーションを自動的に終了します。アプリケーション終了時に別のプロセスを閉じる
どうすれば実現できますか?
おかげ
あなたがProcess.Process
を使用している場合CloseMainWindow
方法があります。オブジェクトへの参照を保持する場合は、後で使用することができます。
ここMSDN
での関連ページと関連するコードです:
// Close process by sending a close message to its main window.
myProcess.CloseMainWindow();
// Free resources associated with process.
myProcess.Close();
これを行うための最も優雅な方法は、他のプロセスのからメインにウィンドウメッセージを送信することが考えられます。 Process.MainWindow.Handle
プロパティを使用してこのメインフォームのハンドルを取得することができます(私はProcess
クラスを使用していると仮定して、PostMessage
Win APIコールを使用してカスタムIDを持つメッセージをこの「子」のメインウィンドウに送信します)他のプロセスのメッセージループは(WndProc
メソッドをオーバーライドすることによって)このメッセージを簡単に検出し、それに従って適切なシャットダウンを実行できます。標準のWM_CLOSE
メソッドを送信することもできます。これは、アプリケーションをForm.Closed
イベントのハンドラから削除しますが、特定の状況でシャットダウンをキャンセルするかどうかで、制御が少なくなる可能性があります。
いくつかのオプションがあります。その
private Stack<Process> _startedProcesses = new Stack<Process>();
private void StartChildProcess(string fileName)
{
Process newProcess = new Process();
newProcess.StartInfo = new ProcessStartInfo(fileName); ;
newProcess.Start();
_startedProcesses.Push(newProcess);
}
アプリケーションを閉じると、あなたはすべてがまだ実行されている子プロセスを開始し終了しますメソッドを呼び出すことができます。それが起動のプロセス。 Killメソッドを使用するか、CloseMainWindowメソッドとCloseメソッドを呼び出すことで、これを使用できます。 CloseMainWindow /閉じる(保存するかどうかを尋ね、メモ帳を起動し、保存されていない変更がある場合は、キルはそれらを失うことになる、閉じるCloseMainWindow /メモ帳を行います)、より優雅なクローズを実行します。
private void CloseStartedProcesses()
{
while (_startedProcesses.Count > 0)
{
Process process = _startedProcesses.Pop();
if (process != null && !process.HasExited)
{
process.CloseMainWindow();
process.Close();
}
}
}
このリンクhttpを参照してください。 //stackoverflow.com/questions/169483/c-win32-notify-when-separate-window-is-closing-closed –
これは類似しているが反対のタスク(別のウィンドウが閉じられたときに現在のアプリケーションをシャットダウンする)を示します。しかし、そこにリンクされているCodeProjectの記事は、ある程度使われるはずです。 – Noldorin