В Windows 7 (и, вероятно, также в Vista / 8 / Server) вы можете использовать системные события, чтобы отслеживать, выключается ли Windows (и выключается ли компьютер) или просто перезагружается. Каждый раз, когда инициируется выключение / перезагрузка (любым способом - нажатием кнопки в меню «Пуск» или программным способом), Windows 7 записывает одно или два события в системный журнал, источник USER32, идентификатор события 1074. Эти события можно записать, если Вы открываете Event Viewer из Администрирования (отфильтруйте системный журнал, чтобы видеть только ID 1074). Описание (сообщение) этих событий содержит тип отключения. Таким образом, вы можете проанализировать описание самого последнего события этого типа (после завершения выключения), ища необходимое слово (завершение работы, перезагрузка / перезапуск).
Я не пытался увидеть тип выключения, записанный в событии, при использовании кнопки питания для корректного выключения Windows (я обычно отключаю эту функцию), но на некоторых сайтах предлагается указывать тип «выключения» вместо « отключение "- так что проверьте, если вам нужно быть уверенным. Или просто ищите тип «перезагрузка» - если он не найден, то предполагается тип «выключение».
В Windows XP, по моему опыту, событие 1074 записывается только в том случае, если завершение работы / перезагрузка выполняется программно (например, во время установки программы или с помощью утилиты shutdown.exe). Таким образом, он не регистрирует выключения, инициированные из оболочки (проводника), но, возможно, вы могли бы объединить этот метод с чтением значения из реестра, как предложено в другом ответе. Кроме того, имейте в виду, что в WinXP сообщение о событии 1074 содержит слово «перезапуск», независимо от того, каков реальный тип выключения, поэтому вам следует посмотреть в поле «Тип выключения:», в котором будет указано «выключение» или "перезагрузка".
В связи с этим идентификатор события 1073 записывается всякий раз, когда Windows по какой-либо причине не удается завершить работу / перезагрузить компьютер (например, если приложение не разрешает отключение в ответ на WM_QUERYENDSESSION). В этом случае сообщение также будет содержать слова «завершение работы», «перезагрузка» или «выключение» - в WinXP. Для Win7 этот тип события менее полезен в нашем случае, так как он не будет иметь никакого значения между выключением и перезагрузкой. Но для WinXP - если вам нужно только перехватить выключение / перезагрузку, выполнить некоторые действия, а затем продолжить соответствующий процесс выключения или перезагрузки - он должен работать как положено.