Chris,
I've got a bit of the same problem with my current app. My chief advantage over yours is that my users are all running forms so I've got a built in counter.
If I were in your shoes I'd consider drafting up some custom class through which each program/module is started. As a part of that class add some counter/tracking mechanism to verify the number of running tasks and the priority of each (make sure that each task ends by decrementing its counter). After all of this trickery is in place just place an ON SHUTDOWN DO ****.PRG where the prg checks the magic class's counter(s) and either terminates the process or stops the user from exiting with an appropriate message.
Admittedly this is a bit of initial coding but after its all in place you have ultimate control over how user termination requests are processed...task management.
Just An Idea...Dont Shoot The Messenger