Можно отнаследоваться от QApplication и перегрузить %osname%EventFilter для нужных вам ОС.
Примерно так:
C++ (Qt)
#include <qt_windows.h>
bool MyApplication :: winEventFilter( MSG *message, long *result )
{
UINT& msg = message->message;
if ( msg == WM_QUERYENDSESSION || msg == WM_ENDSESSION )
{
/*Делаем что нужно*/
*result = ...;
return true;
}
return QApplication::winEventFilter( message, result );
}
Ну или через QCoreApplication::setEventFilter аналогичное попробовать сделать (не пробовал).