Например, у нас есть приложение Win32, которое при закрытии главного окна скрывается в лотке.
Когда пользователь перезагружал или завершал работу ОС, приложения каким-то образом были закрыты.
Как правильно обрабатывать это событие закрытия?
Это описано в MSDN: " Завершение работы".
По сути вам нужно окно верхнего уровня, которое прослушивает либо WM_QUERYENDSESSION
либо WM_ENDSESSION
либо, возможно, и то, и другое. Вы получаете возможность выполнять задачи, связанные с завершением работы при поступлении этих сообщений.
Приложения с окном и очередью сообщений получают уведомления о завершении работы через сообщения WM_QUERYENDSESSION и WM_ENDSESSION. Эти приложения должны возвращать TRUE, чтобы указать, что они могут быть прекращены. Приложения не должны блокировать выключение системы, если это абсолютно необходимо. Приложения должны выполнять любую необходимую очистку при обработке WM_ENDSESSION. Приложения, имеющие несохраненные данные, могут сохранять данные во временное место и восстанавливать их при следующем запуске приложения. Рекомендуется, чтобы приложения сохраняли свои данные и часто указывали; например, автоматически сохранять данные между операциями сохранения, инициированными пользователем, для уменьшения объема данных, которые должны быть сохранены при выключении.
Если вы хотите показать интерфейс во время выключения, возможно, из-за того, что ваше приложение выполняет критические действия, которые не могут пережить прерывание, вы можете использовать ShutdownBlockReasonCreate
.
Если приложение должно заблокировать потенциальное выключение системы, оно может вызвать функцию ShutdownBlockReasonCreate. Вызывающая сторона предоставляет строку причины, которая будет отображаться для пользователя. Строка причины должна быть коротким и понятным, предоставляя пользователю информацию, необходимую для принятия решения о продолжении закрытия системы.
Обратите внимание, что этот процесс сильно изменился с Vista. Если вам нужно поддерживать XP, вам может понадобиться код, который по-разному относится к XP. Эта тема также рассматривается в MSDN: Изменения завершения приложения в Windows Vista.
Вы должны обрабатывать сообщения о завершении работы системы WM_QUERYENDSESSION и WM_ENDSESSION.
Выключение должно приводить к отправке SIGTERM или SIGINT в вашу программу. Вы можете справиться с этим через. Ссылка: http://www.cplusplus.com/reference/csignal/signal/
void my_handler (int param)
{
// clean up here
}
int main ()
{
signal(SIGINT my_handler); // try also SIGTERM
}