Взаимодействие с Windows перезагрузка / выключение

0

Например, у нас есть приложение Win32, которое при закрытии главного окна скрывается в лотке.
Когда пользователь перезагружал или завершал работу ОС, приложения каким-то образом были закрыты.
Как правильно обрабатывать это событие закрытия?

  • 0
    Вы хотите справиться с завершением работы или хотите, чтобы ваше приложение скрывалось как значок на панели задач?
Теги:
winapi

3 ответа

2
Лучший ответ

Это описано в MSDN: " Завершение работы".

По сути вам нужно окно верхнего уровня, которое прослушивает либо WM_QUERYENDSESSION либо WM_ENDSESSION либо, возможно, и то, и другое. Вы получаете возможность выполнять задачи, связанные с завершением работы при поступлении этих сообщений.

Приложения с окном и очередью сообщений получают уведомления о завершении работы через сообщения WM_QUERYENDSESSION и WM_ENDSESSION. Эти приложения должны возвращать TRUE, чтобы указать, что они могут быть прекращены. Приложения не должны блокировать выключение системы, если это абсолютно необходимо. Приложения должны выполнять любую необходимую очистку при обработке WM_ENDSESSION. Приложения, имеющие несохраненные данные, могут сохранять данные во временное место и восстанавливать их при следующем запуске приложения. Рекомендуется, чтобы приложения сохраняли свои данные и часто указывали; например, автоматически сохранять данные между операциями сохранения, инициированными пользователем, для уменьшения объема данных, которые должны быть сохранены при выключении.

Если вы хотите показать интерфейс во время выключения, возможно, из-за того, что ваше приложение выполняет критические действия, которые не могут пережить прерывание, вы можете использовать ShutdownBlockReasonCreate.

Если приложение должно заблокировать потенциальное выключение системы, оно может вызвать функцию ShutdownBlockReasonCreate. Вызывающая сторона предоставляет строку причины, которая будет отображаться для пользователя. Строка причины должна быть коротким и понятным, предоставляя пользователю информацию, необходимую для принятия решения о продолжении закрытия системы.

Обратите внимание, что этот процесс сильно изменился с Vista. Если вам нужно поддерживать XP, вам может понадобиться код, который по-разному относится к XP. Эта тема также рассматривается в MSDN: Изменения завершения приложения в Windows Vista.

  • 0
    Приложение, скрывающееся в трее, в любом случае не должно выполнять такие важные операции. Вероятно, нет причин внезапно показывать пользовательский интерфейс во время выключения.
  • 0
    @MSalters Возможно, приложение для записи компакт-дисков может разумно скрыться в области уведомлений. Я не знаю, что делает приложение Аскера.
Показать ещё 2 комментария
2

Вы должны обрабатывать сообщения о завершении работы системы WM_QUERYENDSESSION и WM_ENDSESSION.

-3

Выключение должно приводить к отправке 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
}
  • 1
    Это Windows, а не POSIX.
  • 0
    Вы правы. Не читал "Сигналы SIGILL и SIGTERM не генерируются под Windows". в MSDN ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню