Creo que puedes detectarlo interceptando el mensaje
WM_QUERYENDSESSION.
...Añado/Edito:
Segun la API, después de que windows envía este mensaje, y si todas las aplicaciones se pueden cerrar, se envía otro WM_ENDSESSION cuyo parámetro wParam es True si se está haciendo un ShutDown.
Añado:
Buscando por ese mensaje, he llegado a
este truco; A ver si te sirve.