Как отключить Alt + F4 закрытие формы? - PullRequest
72 голосов
/ 18 августа 2008

Как лучше всего отключить Alt + F4 в форме c # win, чтобы пользователь не мог закрыть форму?

Я использую форму в качестве всплывающего диалогового окна для отображения индикатора выполнения, и я не хочу, чтобы пользователь мог закрыть его.

Ответы [ 11 ]

102 голосов
/ 18 августа 2008

Это делает работу:

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();
55 голосов
/ 08 сентября 2008

Если вы посмотрите на значение из FormClosingEventArgs e.CloseReason, оно скажет вам, почему форма закрывается. Затем вы можете решить, что делать, возможные значения:

Имя пользователя - Описание


Нет - Причина закрытия не была определена или не может быть определена.

WindowsShutDown - операционная система закрывает все приложения перед выключением.

MdiFormClosing - родительская форма этой формы интерфейса с несколькими документами закрывается.

UserClosing - пользователь закрывает форму через пользовательский интерфейс, например, нажав кнопку «Закрыть» в окне формы, выбрав «Закрыть» в меню управления окна или нажав ALT + F4 .

TaskManagerClosing - Диспетчер задач Microsoft Windows закрывает приложение.

FormOwnerClosing - Форма владельца закрывается.

ApplicationExitCall - Вызван метод Exit класса Application.

25 голосов
/ 09 января 2009

Я считаю, что это правильный способ сделать это:

protected override void OnFormClosing(FormClosingEventArgs e)
{
  switch (e.CloseReason)
  {
    case CloseReason.UserClosing:
      e.Cancel = true;
      break;
  }

  base.OnFormClosing(e);
}
16 голосов
/ 19 августа 2008

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

13 голосов
/ 18 августа 2008

Вы можете обработать событие FormClosing и установить FormClosingEventArgs.Cancel на true.

12 голосов
/ 19 августа 2008

Я использую форму в качестве всплывающего диалогового окна для отображения индикатора выполнения, и я не хочу, чтобы пользователь мог закрыть его.

Если пользователь полон решимости закрыть ваше приложение (и обладает достаточными знаниями), чтобы нажать alt + f4, он, скорее всего, также будет достаточно осведомлен, чтобы вместо этого запустить диспетчер задач и убить ваше приложение.

По крайней мере, с помощью alt + f4 ваше приложение может выполнить плавное завершение работы, вместо того, чтобы просто убивать его. Исходя из опыта, люди, убивающие ваше приложение, означают испорченные файлы конфигурации, поврежденные базы данных, неполные задачи, которые вы не можете возобновить, и многие другие болезненные вещи.

По крайней мере, попросите их сказать «Вы уверены», а не вывести их из строя.

4 голосов
/ 16 ноября 2017

Это хак для отключения Alt + F4 .

private void test_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.ModifierKeys == Keys.Alt || this.ModifierKeys == Keys.F4) 
    { 
        e.Cancel = true; 
    }    
}
3 голосов
/ 31 мая 2018

Это делает работу:

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;
  }


}
2 голосов
/ 05 марта 2013

Подписаться FormClosing событие

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = e.CloseReason == CloseReason.UserClosing;
}

Только одна строка в теле метода.

2 голосов
/ 18 августа 2008

Будет ли вызываться FormClosing, даже если вы программно закрываете окно? Если это так, вы, вероятно, захотите добавить некоторый код, позволяющий закрывать форму после ее завершения (вместо того, чтобы всегда отменять операцию)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...