Лови сообщение WM_POWERBROADCAST. Когда изменяется power state, система посылает это сообщение. В wparam должно быть PBT_APMSUSPEND
(0x4). Значит готовься к переходу в энергосберегающий режим. И наверное еще wparam равен PBT_APMPOWERSTATUSCHANGE (0xA). Сам не проверял.
Также Майкрософт пишет о таких константах как PBT_APMQUERYSUSPEND (0x0000) и PBT_APMQUERYSTANDBY (0x0001) как устаревших, и утверждает что в ХР++ не будет работать. Но вроде как в ХР они есть в сообщении.
Майкрософт утверждает что нельзя никак отличить в какой режим энергосбережения готовится перейти система (S1,S3,S4)... Ну, как отличить S1 и S3 я сам без понятия, если оно в БИОС указывается, а вот S1 и S4 (Hybernate) похоже можно))
