Question

I've been able to use a winforms application to open another winforms application using:

Rhino4.Application oRhino = (Rhino4.Application)Activator.CreateInstance(Type.GetTypeFromProgID("Rhino4.Application"));

But how do I check if it gets closed? Is it possible to create an event that will get fired when the user closes the application?

EDIT

Process[] pr = Process.GetProcessesByName("Rhino4");


                for (int i = 0; i < pr.Length; i++)
                {


                    if (pr[i].MainWindowTitle != null)
                    {
                        if (pr[i].MainWindowTitle.Length > 4)
                        {
                            if (pr[i].MainWindowTitle.Substring(0, 4) == "wall")
                            {
                                pr[i].Exited += new EventHandler(caseInfoMenu_Exited);

                            }
                        }
                    }

                }


void caseInfoMenu_Exited(object sender, EventArgs e)
        {
            MessageBox.Show("Window closed");
        }

I've managed to identify the process using this code. But the Exited-event doesn't fire when I close the program.

Was it helpful?

Solution

Its maybe not the most elegant solution but indirectly you could do this by checking if the process exist or not and then do this repeatable. This is of course if you do not already have a handle to the process.

void checkProcess()
{
    Process[] processes = Process.GetProcessesByName("NameOfProcess");
    if (processes.Length == 0)
    {
         // No such process
    }
    else
    {
         foreach (Process proc in processes)
         {
            // do something with proc
         }
    }
}

Edit: Some thoughts on this after reading the posts in Abdul's answer plus your own question. This is by no means an answer, but maybe it can help you on your quest.

Firstly, Activator.CreateInstance calls the best fitting constructor on the object type that you give to it and returns a handle to that object. It does create the threads/processes itself and thus it has not knowledge about them. The (9) processes you'll see in your list are probably created by the Rheno4 class itself. There is a discussion about this here.

Secondly, according to msdn the EnableRaisingEvents property should be set to true when the process is created for the Exited event to function correctly. This leaves me wondering what happens when you attach the event after the process is already created?

You could of course iterate over all matching processess before and after calling CreateInstance to extract all new instances of Rheno4 that has been created. But this is far from a bulletproof solution and the risk is that you are fetching processes that are created by someone else or that not all processes are retreived (in case there is a delay in creating the other object). Depending on your needs, however, this maybe is appliable.

Another thought. The processes returned from the GetProcessesByName has a rich set of properties. Maybe you can look though these and find a common denominator for the processes returned. The ones I would start to investigate are: Threads, StartInfo, MainModule.

OTHER TIPS

What about catching Exited event

myProcess.Exited += new EventHandler(myProcess_Exited);



private void myProcess_Exited(object sender, System.EventArgs e)
    {

        eventHandled = true;
        Console.WriteLine("Exit time:    {0}\r\n" +
            "Exit code:    {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime);
    }

Source msdn.

If you want to start the application again after closing then :- I think you need to crearte a Windows Service which will keep checking the process running and if it is closed then start the application again

As far as events are concern then "Closing" and "Close" events are there in Windows App which fires when user shutdowns the app.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top