Pull to refresh

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

Reading time2 min
Views4.2K
Original author: 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. Закрытие программы пользователем.
Tags:
Hubs:
Total votes 35: ↑26 and ↓9+17
Comments11

Articles