2009-06-03 238 views
4

我有一個C#winform應用程序,在其工作期間打開另一個Winform進程。另一個進程擁有自己的UI。 當我關閉父應用程序時,我想讓其他應用程序自動關閉。當應用程序關閉時關閉另一個進程

我該如何做到這一點?

感謝

+0

看到這個連結http: //stackoverflow.com/questions/169483/c-win32-notify-when-separate-window-is-closing-closed – 2009-06-03 08:45:15

+0

這是指一個類似的,但相反的任務(關閉當前的應用程序,當另一個窗口關閉)。但CodeProject的文章應該有一些用處。 – Noldorin 2009-06-03 08:55:54

回答

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(); 
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(); 
     } 
    } 
}