Поместите вашу программу в отдельный поток, приостановите поток с помощью
System.Threading.Thread.CurrentThread.Suspend()
и перезапустите его из другого потока, который прослушивает события мыши / клавиатуры.
Edit:
Ok. Приостановка потока является злой и не обязательной, поскольку сама Program-Thread входит в состояние Suspended - лучше в состояние ожидания или ожидания. Так что просто подождите (Sleep-Cycle, WaitHandle - какой-то семафор и т. Д.) Интерфейсный поток, чтобы позволить программному потоку развиваться.