Как стать автором
Обновить

Определение причины закрытия приложения Windows Forms (.Net)

Время на прочтение2 мин
Количество просмотров4.3K
Автор оригинала: Manish Ranjan Kumar

Предпосылки к написанию статьи


Я работал над одним приложением и мой клиент захотел, чтобы оно реагировало на завершение работы системы. Я вспомнил, что многие приложения производили некоторые действия при закрытии, но я редко встречал программу, которая различала бы способ её закрытия — пользователем или системой. И я подумал, почему бы не показать людям, что можно кое-что изменить в дизайне приложения.

Я видел несколько программ, которые подписывались на событие FormClosing и показывали MessageBox с сообщением о закрытии, но, когда приложение закрывалось системой, оно все так же показывало это сообщение и происходила либо потеря данных, либо приостановка завершения системы.

Поэтому я решил написать статью об этом.

Основная идея


FormClosingEventArgs наследуется от CancelEventArgs. У FormClosingEventArgs есть свойство CloseReason, которое содержит причину завершения работы. Это можно использовать для определения причины закрытия.

Теперь есть два пути получения этих аргументов во время завершения работы.

1. Можно переопределить метод OnClosing класса Form и привести CancelEventArgs к FormClosingEventArgs
protected override void OnClosing(CancelEventArgs e)
{
  FormClosingEventArgs ce = e as FormClosingEventArgs;
  if (ce != null)
  {
    // Обрабатываем событие
  }
  base.OnClosing(e);
}



2. Можно подписаться на событие FormClosing:
private void SampleForm_FormClosing(object sender, FormClosingEventArgs e)
{
  // Обрабатываем событие
}


Обработка закрытия


switch (ce.CloseReason)
{
  case CloseReason.ApplicationExitCall:
    // вызван метод Exit класса Application
    break;
  case CloseReason.FormOwnerClosing:
    // закрывается родительская форма
    break;
  case CloseReason.MdiFormClosing:
    // закрывается родительская MDI форма
    break;
  case CloseReason.None:
    // неизвестная причина закрытия
    break;
  case CloseReason.TaskManagerClosing:
    // закрытие менеджером задач
    break;
  case CloseReason.UserClosing:
    // закрытие пользователем
    break;
  case CloseReason.WindowsShutDown:
    // закрытие при завершении работы Windows
    break;
}




Рис. 1. Завершение работы Windows.


Рис. 2. Закрытие родительского MDI окна.


Рис. 3. Закрытие программы пользователем.
Теги:
Хабы:
Всего голосов 35: ↑26 и ↓9+17
Комментарии11

Публикации

Истории

Работа

.NET разработчик
59 вакансий

Ближайшие события

19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн