2009-06-03 14 views
4

C#winformアプリケーションがあり、その作業中に別のWinformプロセスが開かれています。他のプロセスには独自のUIがあります。 親アプリケーションを閉じると、他のアプリケーションを自動的に終了します。アプリケーション終了時に別のプロセスを閉じる

どうすれば実現できますか?

おかげ

+0

このリンクhttpを参照してください。 //stackoverflow.com/questions/169483/c-win32-notify-when-separate-window-is-closing-closed –

+0

これは類似しているが反対のタスク(別のウィンドウが閉じられたときに現在のアプリケーションをシャットダウンする)を示します。しかし、そこにリンクされているCodeProjectの記事は、ある程度使われるはずです。 – Noldorin

答えて

4

あなたがProcess.Processを使用している場合CloseMainWindow方法があります。オブジェクトへの参照を保持する場合は、後で使用することができます。

ここMSDN

での関連ページと関連するコードです:

// Close process by sending a close message to its main window. 
myProcess.CloseMainWindow(); 
// Free resources associated with process. 
myProcess.Close(); 
+0

私はこれをdownvoteの理由を見ることができません。 Closeメソッドを呼び出す前にCloseMainWindowへの呼び出しを追加しても、完璧に実行可能なソリューションです。 –

+0

Shobanの答えと同じ理由で投票が遅れました。これは、プロセスを閉じる正しい方法ではありません。 – Noldorin

+0

OKだから私は間違った方法を持っていましたが、実際にMSDNのページを読んで正しいものが得られました。OPが実行できると確信しています – ChrisF

1

これを行うための最も優雅な方法は、他のプロセスのからメインにウィンドウメッセージを送信することが考えられます。 Process.MainWindow.Handleプロパティを使用してこのメ​​インフォームのハンドルを取得することができます(私はProcessクラスを使用していると仮定して、PostMessage Win APIコールを使用してカスタムIDを持つメッセージをこの「子」のメインウィンドウに送信します)他のプロセスのメッセージループは(WndProcメソッドをオーバーライドすることによって)このメッセージを簡単に検出し、それに従って適切なシャットダウンを実行できます。標準のWM_CLOSEメソッドを送信することもできます。これは、アプリケーションをForm.Closedイベントのハンドラから削除しますが、特定の状況でシャットダウンをキャンセルするかどうかで、制御が少なくなる可能性があります。

3

いくつかのオプションがあります。その

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(); 
     } 
    } 
} 
関連する問題