Як я можу змінити те, що відбувається, коли користувач натискає кнопку закриття (червоний X) у програмі Windows Forms (у C #)?
Відповіді:
Ви можете замінити OnFormClosing, щоб зробити це. Тільки будьте обережні, щоб не робити нічого надто несподіваного, оскільки натискання кнопки «X» для закриття - це добре зрозуміла поведінка.
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
if (e.CloseReason == CloseReason.WindowsShutDown) return;
// Confirm user wants to close
switch (MessageBox.Show(this, "Are you sure you want to close?", "Closing", MessageBoxButtons.YesNo))
{
case DialogResult.No:
e.Cancel = true;
break;
default:
break;
}
}
==
Перевизначте метод OnFormClosing .
ПОПЕРЕДЖЕННЯ. Вам потрібно перевірити CloseReason і змінити поведінку лише у випадку, якщо це UserClosing. Не слід вкладати сюди нічого, що могло б зупинити процедуру вимкнення Windows.
Зміни завершення роботи програми в Windows Vista
Це відповідає вимогам програми з логотипом Windows 7 .
Однієї речі, якої бракує цих відповідей, і яку, мабуть, шукають новачки, є те, що хоча приємно влаштувати подію:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// do something
}
Це взагалі нічого не зробить, якщо ви не зареєструєте подію . Помістіть це в конструктор класу:
this.FormClosing += Form1_FormClosing;
Або перевизначте OnFormClosing, або зареєструйтесь для події FormClosing .
Це приклад перевизначення функції OnFormClosing у похідній формі:
protected override void OnFormClosing(FormClosingEventArgs e)
{
e.Cancel = true;
}
Це приклад обробника події, щоб зупинити закриття форми, яка може бути в будь-якому класі:
private void FormClosing(object sender,FormClosingEventArgs e)
{
e.Cancel = true;
}
Щоб отримати додаткові характеристики, перевірте властивість CloseReason на FormClosingEventArgs, щоб переконатися, що виконано відповідну дію. Можливо, ви захочете виконати альтернативну дію, лише якщо користувач намагається закрити форму.
як сказав Джон Б, але ви також хочете перевірити наявність ApplicationExitCall
і TaskManagerClosing
CloseReason:
protected override void OnFormClosing(FormClosingEventArgs e)
{
if ( e.CloseReason == CloseReason.WindowsShutDown
||e.CloseReason == CloseReason.ApplicationExitCall
||e.CloseReason == CloseReason.TaskManagerClosing) {
return;
}
e.Cancel = true;
//assuming you want the close-button to only hide the form,
//and are overriding the form's OnFormClosing method:
this.Hide();
}
Замінити OnFormClosing ?
Однією з ситуацій, коли цілком корисно мати можливість обробляти подію натискання кнопки x, є використання форми, яка є контейнером MDI. Причина полягає в тому, що закриті та закриті заходи проводяться спочатку з дітьми і, нарешті, з батьками. Отже, за одним сценарієм користувач натискає кнопку x, щоб закрити програму, а батько MDI запитує підтвердження для продовження. У випадку, якщо він вирішить не закривати заявку, а продовжувати все, що він робить, діти вже обробляють закриття події, що потенційно втрачає інформацію / працює будь-що. Одним із рішень є перехоплення повідомлення WM_CLOSE із циклу повідомлень Windows у вашій головній формі програми (тобто яке закрите, припиняє роботу програми) таким чином:
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0010) // WM_CLOSE
{
// If we don't want to close this window
if (ShowConfirmation("Are you sure?") != DialogResult.Yes) return;
}
base.WndProc(ref m);
}
Це досить поширене запитання. Тут є одна хороша відповідь:
VB.NET перевантажує функціональність за замовчуванням, коли користувач натискає X (Закрити програму)
Якщо вам не зручно розміщувати свій код у події Form_Closing, єдиним іншим варіантом, який мені відомий, є "хак", який я використовував один-два рази. Не слід вдаватися до цього злому, але ось воно:
Не використовуйте звичайну кнопку закриття. Натомість створіть форму, щоб у ній не було ControlBox. Ви можете зробити це, встановивши на формі ControlBox = false, і в цьому випадку у вас все ще залишиться звичайна панель у верхній частині форми, або ви можете встановити FormBorderStyle форми на "None". Якщо ви йдете цим другим маршрутом, там не буде смужки вгорі або будь-якої іншої видимої межі, тому вам доведеться імітувати їх, намалювавши форму або художньо використовуючи елементи керування панеллю.
Потім ви можете додати стандартну кнопку і зробити його виглядати як кнопка закриття, і покласти очищенні коду там. В кінці події кнопки просто зателефонуйте this.Close()
(C #) або Me.Close()
(VB)
Прийнята відповідь працює досить добре. Альтернативний метод, який я використав, - це створення методу FormClosing для основної форми. Це дуже схоже на заміну. Мій приклад - для програми, яка зводить до системного трею при натисканні кнопки закриття на формі.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.ApplicationExitCall)
{
return;
}
else
{
e.Cancel = true;
WindowState = FormWindowState.Minimized;
}
}
Це дозволить ALT + F4 або що-небудь у додатку, що викликає Application.Exit (); щоб діяти нормально, тоді як натискання кнопки (X) мінімізує Додаток.
protected override bool ProcessCmdKey(ref Message msg, Keys dataKey)
{
if (dataKey == Keys.Escape)
{
this.Close();
//this.Visible = false;
//Plus clear values from form, if Visible false.
}
return base.ProcessCmdKey(ref msg, dataKey);
}