Tutorial :Close another process when application is closing



Question:

I have a C# winform application that during its work opens another Winform process. The other process has UI of its own. When I close the parent application, I want the other application to be closed automatically.

How can I achieve that?

Thanks


Solution:1

If you are using Process.Process there is the CloseMainWindow method. If you keep a reference to the object you can use it later.

Here's the relevant page in the MSDN

and the relevant code:

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


Solution:2

There are several different options. I would suggest that you have your application keep track of the processes that it starts:

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

When the application closes, you can call a method that will close all started child processes that are still running. You can use this either with the Kill method or by calling the CloseMainWindow and Close methods. CloseMainWindow/Close will perform a more graceful close (if you start Notepad and there are unsaved changes, Kill will lose them, CloseMainWindow/Close will make notepad ask if you want to save):

private void CloseStartedProcesses()  {      while (_startedProcesses.Count > 0)      {          Process process = _startedProcesses.Pop();          if (process != null && !process.HasExited)          {              process.CloseMainWindow();              process.Close();          }      }  }  


Solution:3

The most graceful way to do this is probably to send a window message to the main from of the other process. You can get the handle of this main form simply using the Process.MainWindow.Handle property (I assume you are using the Process class, and then just use the PostMessage Win API call to send a message with a custom ID to the main window of this "child" process. Then, the message loop of the other process can easily detect this message (by overriding the WndProc method) and perform a proper shutdown accordingly. An alternative would be to send the standard WM_CLOSE method, which would mean you would just have to unload the application from the handler of the Form.Closed event, but may perhaps allow you less control (over whether to cancel the shutdown in certain situations).


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »