Ciao
Quello che chiedi è difficilmente fattibile.
Parlando di C#, se vuoi esiste la classe Process che ti dice i processi attualmente aperti e, volendo, c'è anche l'handle (riferimento) della finestra principale di tale processo.
Quello che puoi fare è quindi prendere tutti i processi, vedere se hanno una main window (se non c'è sono i processi in background) e quindi salvarti tutte le informazioni di quel processo (c'è anche il path completo dell'eseguibile).
Fin qui sembrerebbe tutto facile. Il problema è che con queste istruzioni puoi benissimo riaprire tutti i processi attivi in precedenza e riposizionare le finestre, però lo “stato” di quei processi non riesci a ripristinarlo.
Ad esempio, se hai aperto il programma per gestire la posta e ti sei posizionato sulla mail “Ho fatto 6 al superenalotto”, poi quando rilanci il processo, questo si posizionerà in automatico sulla prima email, così come se avessi appena aperto il programma. Quindi di fatto hai riaperto il programma ma non sei nella condizione in cui hai lasciato il tutto quando hai spento il PC
Detto questo, che è un problema tecnico, il tuo scopo qual è?
Perchè, se ricordo bene, puoi decidere di “ibernare” il sistema, per cui Windows in automatico salva tutto quello che serve e lo ripristina quando esci dallo stato di ibernazione. Secondo me è il massimo che puoi ottenere