In Windows 7 (e probabilmente anche in Vista/8/Server) è possibile utilizzare gli eventi di sistema per tenere traccia se Windows si sta spegnendo (e spegnere il computer) o semplicemente riavviare. Ogni volta che viene avviato uno spegnimento/riavvio (con qualsiasi mezzo, facendo clic sul pulsante nel menu Start o programmaticamente), Windows 7 scrive uno o due eventi nel registro di sistema, origine USER32, ID evento 1074. È possibile vedere questi eventi registrati se apri il Visualizzatore eventi da Strumenti di amministrazione (filtra il registro di sistema per vedere solo ID 1074). La descrizione (messaggio) di questi eventi contiene il tipo di arresto. Quindi è possibile analizzare la descrizione dell'evento più recente di questo tipo (dopo l'avvio dello spegnimento), cercando la parola necessaria (arresto, riavvio/riavvio).
Non ho provato a vedere il tipo di spegnimento scritto nell'evento quando si utilizza il pulsante di accensione per arrestare con garbo Windows (solitamente disattivo questa funzione), ma alcuni siti suggeriscono di indicare un tipo di spegnimento invece di "shutdown" - quindi dai un'occhiata, se hai bisogno di essere sicuro. O semplicemente cerca un tipo di "riavvio" - se non viene trovato, si presume un tipo di "arresto".
In Windows XP, dalla mia esperienza, un evento 1074 viene registrato solo se l'arresto/riavvio viene eseguito a livello di codice (ad esempio durante l'installazione di un programma o l'utilizzo dell'utilità shutdown.exe). Quindi non registra gli arresti avviati dalla shell (Explorer), ma forse potresti combinare questo metodo con la lettura del valore dal registro come proposto in un'altra risposta. Inoltre, tieni presente che in WinXP il messaggio dell'evento 1074 contiene la parola "restart" indipendentemente dal vero tipo di arresto, quindi dovresti controllare il campo "Shutdown Type:", che indicherà "shutdown" o "reboot".
In relazione a ciò, un ID evento 1073 viene registrato ogni volta che Windows non riesce a spegnersi/riavviarsi per qualche motivo (ad esempio se un'applicazione non consente l'arresto come risposta a WM_QUERYENDSESSION). In quel caso il messaggio conterrà anche parole come "shutdown", "reboot" o "power off" - in WinXP. Per Win7 questo tipo di evento è meno utile nel nostro caso, dal momento che non farà alcuna differenza tra shutdown e riavvio. Ma per WinXP - se devi solo intercettare lo spegnimento/riavvio, eseguire alcune azioni, quindi continuare il processo di spegnimento o riavvio corrispondente - dovrebbe funzionare come previsto.
Ovviamente si presume che il sistema si stia arrestando perché l'utente corrente l'ha avviato e lo ha fatto in Esplora risorse. Se si tratta di uno spegnimento programmatico, spegnimento da un'altra app o spegnimento da parte di un altro utente, si otterrà il motivo per un arresto precedente. – MSalters
-1 Perché la risposta è incompleta e specifica per Windows Explorer. Sembra anche essere ** rimosso ** in Windows 7. – unixman83
Funziona bene con WindowsXP ma non con Windows7 – conceptacid