En Windows 7 (y probablemente también en Vista/8/Server) puede usar los eventos del sistema para rastrear si Windows se está apagando (y apagando la computadora) o simplemente reiniciándose. Cada vez que se inicia un apagado/reinicio (por cualquier medio, haciendo clic en el botón en el menú Inicio o programáticamente), Windows 7 escribe uno o dos eventos en el registro del sistema, origen USER32, evento ID 1074. Puede ver estos eventos grabados si abre el Visor de eventos desde Herramientas administrativas (filtra el registro del sistema para ver solo la ID 1074). La descripción (mensaje) de estos eventos contiene el tipo de apagado. Por lo tanto, podría analizar la descripción del evento más reciente de este tipo (después de que se inició el apagado), buscando la palabra necesaria (apagado, reinicio/reinicio).
No intenté ver el tipo de apagado escrito en el evento cuando utilicé el botón de encendido para cerrar Windows correctamente (normalmente desactivo esta función), pero algunos sitios sugieren que indica un tipo de "apagado" en lugar de "shutdown" - así que échale un vistazo, si necesitas estar seguro. O simplemente busque un tipo de "reinicio" - si no se encuentra, entonces se asume el tipo de "apagado".
En Windows XP, desde mi experiencia, un evento 1074 se registra solo si el apagado/reinicio se realiza mediante programación (por ejemplo, durante la instalación de un programa o usando la utilidad shutdown.exe). Por lo tanto, no registra los cierres iniciados desde el shell (Explorer), pero quizás podría combinar este método con la lectura del valor del registro como se propone en otra respuesta. Además, tenga en cuenta que en WinXP el mensaje del evento 1074 contiene la palabra "reiniciar" sin importar cuál sea el tipo real de apagado, por lo que debe mirar el campo "Tipo de apagado:", que indicará "apagado" o "reiniciar".
En relación con esto, se registra un evento ID 1073 siempre que Windows no se apaga/reinicia por alguna razón (por ejemplo, si una aplicación no permite apagarla como respuesta a WM_QUERYENDSESSION). En ese caso, el mensaje también contendrá palabras como "apagar", "reiniciar" o "apagar" - en WinXP. Para Win7, este tipo de evento es menos útil en nuestro caso, ya que no hará ninguna diferencia entre el apagado y el reinicio. Pero para WinXP: si solo necesita interceptar el apagado/reinicio, realizar algunas acciones y luego continuar con el proceso de apagado o reinicio correspondiente, debería funcionar como se esperaba.
Por supuesto, suponiendo que el sistema se está cerrando ahora porque el usuario actual lo inició, y lo hizo en el Explorador. Si se trata de un apagado programático, cierre desde otra aplicación o apagado por otro usuario, obtendría el motivo de un apagado anterior. – MSalters
-1 Porque la respuesta es incompleta y específica para Windows Explorer. También parece estar ** eliminado ** en Windows 7. – unixman83
Funciona bien bajo WindowsXP pero no bajo Windows7 – conceptacid