Для всех приложений, работающих на вашем компьютере, это просто невозможно, используя чистый управляемый код. На самом деле, даже с неуправляемым кодом у вас будет адское время. Я бы не сказал, что это невозможно, но, вероятно, чрезвычайно сложно и требует много времени.
Вот несколько полезных ресурсов, с которых можно начать:
Арун Кишан в ядре Windows
http://www.dotnetrocks.com/default.aspx?ShowNum=434
основной дамп
http://en.wikipedia.org/wiki/Core_dump
SetContext
http://en.wikipedia.org/wiki/Setcontext
Раймонд Чен о "гибернации" отдельных процессов
http://blogs.msdn.com/oldnewthing/archive/2004/04/20/116749.aspx
Для вашего собственного приложения лучше всего выделить все состояния, которые вы хотели бы восстановить, в набор сериализуемых классов. Затем, когда ваше приложение выгружается (или периодически), сохраните эти данные на диск с помощью XMLSerializer. Когда ваше приложение загружается снова, снова используйте XMLSerializer для повторной гидратации ваших классов, содержащих состояние вашего приложения, и используйте эту информацию, чтобы вернуть пользовательский интерфейс в предыдущее состояние. Если у вас сложные пользовательские интерфейсы, это может занять много времени.