Как отключить сочетание клавиш Alt + F4 для закрытия формы?


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

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

11 67

11 ответов:

это работает:

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

Edit: в ответ на озабоченность pix0rs - да, вы правы, что вы не сможете программно закрыть приложение. Однако, вы можете просто удалить обработчик событий для события form_closing перед закрытием форма:

this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
this.Close();

@TK

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

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


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

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

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

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

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

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

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

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

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

  base.OnFormClosing(e);
}

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

вы могли бы справиться с FormClosing событие и установить FormClosingEventArgs.Cancel to true.

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

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

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

по крайней мере, подскажите им "вы уверены", а не просто предотвратите это.

это работает для меня 100% это для отключения ALT + F4

    private void test_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (test.ModifierKeys == Keys.Alt || test.ModifierKeys == Keys.F4) 
        { 
            e.Cancel = true; 
        }    
    }

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

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

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

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

это работает:

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


}

скрыть кнопку закрытия на форме, используя следующее В конструкторе формы:

this.ControlBox = false;