Ragoler
Ragoler

Reputation: 1271

Close another process when application is closing

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

Upvotes: 5

Views: 5544

Answers (3)

Fredrik Mörk
Fredrik Mörk

Reputation: 158379

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

Upvotes: 3

Noldorin
Noldorin

Reputation: 147461

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).

Upvotes: 1

ChrisF
ChrisF

Reputation: 137188

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

Upvotes: 5

Related Questions