Який найкращий спосіб вимкнути Alt+F4 у формі ac # win, щоб не дати користувачеві закрити форму?
Я використовую форму як спливаюче діалогове вікно для відображення індикатора виконання, і я не хочу, щоб користувач міг його закрити.
Який найкращий спосіб вимкнути Alt+F4 у формі ac # win, щоб не дати користувачеві закрити форму?
Я використовую форму як спливаюче діалогове вікно для відображення індикатора виконання, і я не хочу, щоб користувач міг його закрити.
Відповіді:
Це робить роботу:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
}
Редагувати: у відповідь на занепокоєння pix0rs - так, ви праві, що не зможете програмно закрити програму. Однак ви можете просто видалити обробник події для події form_closing перед закриттям форми:
this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
this.Close();
e.Cancel = (e.Reason == CloseReason.UserClosing);
. Таким чином ви гарантуєте, що не закриєте лише тоді, коли КОРИСТУВАЧ намагається закрити форму.
Якщо ви подивіться на значення з FormClosingEventArgs e.CloseReason
, він розповість вам , чому форма закривається. Потім ви можете вирішити, що робити, можливі значення:
Ім'я учасника - Опис
Жоден - Причина закриття не була визначена або не може бути визначена.
WindowsShutDown - Операційна система закриває всі програми перед вимкненням.
MdiFormClosing - батьківська форма цієї форми багаторазового інтерфейсу документа (MDI) закривається.
UserClosing - Користувач закриває форму через користувальницький інтерфейс (UI), наприклад, натискаючи кнопку Закрити у вікні форми, вибираючи Закрити в меню керування вікном або натискаючи ALT+ F4.
TaskManagerClosing - Диспетчер завдань Microsoft Windows закриває програму.
FormOwnerClosing - форма власника закривається.
ApplicationExitCall - викликано метод Exit класу Application.
CloseReason
і DialogResult
для досягнення найкращих результатів.
Я вважаю, що це правильний спосіб зробити це:
protected override void OnFormClosing(FormClosingEventArgs e)
{
switch (e.CloseReason)
{
case CloseReason.UserClosing:
e.Cancel = true;
break;
}
base.OnFormClosing(e);
}
Зверніть увагу, що програма вважається поганою формою, щоб повністю запобігти закриттю. Вам слід перевірити аргументи події для події Closing, щоб визначити, як і чому вашу програму було запропоновано закрити. Якщо це пов’язано з вимкненням Windows, не слід перешкоджати закриттю.
Я використовую форму як спливаюче діалогове вікно для відображення індикатора виконання, і я не хочу, щоб користувач міг його закрити.
Якщо користувач твердо вирішив закрити ваш додаток (і обізнаний) настільки, щоб натиснути alt + f4, він, швидше за все, також буде достатньо обізнаним, щоб запустити диспетчер завдань і замість цього вбити вашу програму.
Принаймні за допомогою alt + f4 ваш додаток може витончено вимкнути роботу, а не просто змусити людей її вбити. З досвіду, люди, які вбивають ваш додаток, означають пошкоджені файли конфігурації, пошкоджені бази даних, напівфабрикати, які ви не можете відновити, та багато інших болючих справ.
Принаймні, підкажіть їм "ви впевнені", а не відверто запобігайте цьому.
Це хак для відключення Alt+ F4.
private void test_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.ModifierKeys == Keys.Alt || this.ModifierKeys == Keys.F4)
{
e.Cancel = true;
}
}
System.Windows.Forms
, вам потрібно буде перевірити статичну Control.ModifierKeys
властивість, а не this.ModifierKeys
властивість (як показано у фрагменті вище).
Це робить роботу:
bool myButtonWasClicked = false;
private void Exit_Click(object sender, EventArgs e)
{
myButtonWasClicked = true;
Application.Exit();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (myButtonWasClicked)
{
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}
Чи буде викликано FormClosing навіть тоді, коли ви програмно закриваєте вікно? Якщо так, ви, мабуть, захочете додати якийсь код, щоб дозволити форму закрити, коли закінчите з нею (замість того, щоб завжди скасовувати операцію)
Приховати кнопку закриття на формі, використовуючи наступне в конструкторі форми:
this.ControlBox = false;