Thank you all, I think I have found a solution, here is a summary of what I
think I've learned
1. In all the forms of your application, override OnClosing and respond by
setting e.Cancel to true - this prevents immediate termination
2. If you change the form in response to the OnClosing (for example, if
Form1 gets the OnClosing, make Form1 invisible, and bring up Form2), this
appears to give you all the time you need to shutdown.
3. Do whatever you need to clean up for termination (just like you actually
had an exit or quit in a normal application).
4. Exit your application.
The only side effect seems to be that the "not responding" dialog still
comes up after you terminate, but I can live with that.
In my experiments, recieving the OnClosing in Form1, bringing up Form2
(actually named the same thing as Form1) waiting 20, 30, 40 seconds
(simulating shutdown tasks) while Form2 was up before exiting my application
seemed to work.
It would be nice if you could do something that basically told the system,
"Yes I'm still alive and no, I do not want to shutdown now" but if the above
works in my real application I can live without it.
Again, thanks for the help....