Как отключить Alt + F4 закрытие формы?

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

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

18.08.2008 17:16:52
В обработчике событий FormClosing не могли бы вы запросить буфер клавиатуры (у вас даже есть доступ к этому?) Для se, если были нажаты [Alt] + [F4], отменить, если true, продолжить, если нет?
TK. 18.08.2008 17:38:14
11 ОТВЕТОВ
РЕШЕНИЕ

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

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();
103
2.09.2018 16:43:29
Я подозреваю, что большинство людей реализуют этот метод в рассматриваемой форме (Form1). В этом случае рекомендуется не прикреплять делегат, а переопределить метод OnFormClosing. «Метод OnFormClosing также позволяет производным классам обрабатывать событие, не подключая делегат. Это предпочтительный метод для обработки события в производном классе». tinyurl.com/3dzzljq
antsyawn 26.05.2011 04:09:33
Я сделал бы обработчик события , как , например: e.Cancel = (e.Reason == CloseReason.UserClosing);. Таким образом, вы гарантируете, что не закроете, только когда ПОЛЬЗОВАТЕЛЬ попытается закрыть форму.
Paulo Santos 5.08.2011 11:37:20
У этого подхода есть одна большая проблема: если вы хотите выключить / перезагрузить компьютер, он также отменит этот запрос (по крайней мере, в Windows XP)
conceptacid 3.04.2014 13:59:50
Это блестяще! Особенно мне нравится удалять событие, когда вы хотите закрыть форму. Это так просто!
Will 10.04.2014 15:10:42
@Will: я отредактировал ответ. Теперь есть решение, которое работает без удаления обработчика событий.
Thomas Weller 2.09.2018 13:06:51

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

13
18.08.2008 17:20:15

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

2
18.08.2008 17:46:48
Ответ на ваш вопрос - «да». Пожалуйста, не публикуйте дополнительные вопросы в качестве ответа. Уже есть действительно хороший, высоко оцененный и принятый ответ. Если вы не возражаете, не могли бы вы удалить свою? Это действительно не добавляет ценности. Я проголосовал за 3 из ваших ответов, чтобы компенсировать удаление.
Thomas Weller 2.09.2018 13:09:05

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

16
18.08.2008 21:19:32

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

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

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

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

12
18.08.2008 21:25:12

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

Имя участника - Описание


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

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

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

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

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

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

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

57
5.02.2019 15:52:19
Если бы только они создали UserClosing, чтобы сделать его более детализированным, чтобы вы могли целенаправленно
blak3r 25.02.2010 21:24:14
if (e.CloseReason == CloseReason.UserClosing) {e.Cancel = true; }
adnan2nd 18.08.2018 10:30:47
Объединить CloseReasonи DialogResultдля достижения наилучших результатов.
Thomas Weller 2.09.2018 13:11:49

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

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

  base.OnFormClosing(e);
}
25
9.01.2009 13:17:17
лучше заменить перерыв на возвращение
Bahadır Yağan 24.04.2011 20:30:50
На самом деле я считаю, что правильный шаблон - установить флаг отмены в true, а затем вызвать базовый класс. При переопределении методов On [Event] важно вызывать базовый класс, чтобы любые подписчики события также были уведомлены о событии. Да, в этом случае легко подумать, что, поскольку вы отменили событие, никто больше не должен знать об этом, но я не считаю правильным делать такое предположение.
antsyawn 27.04.2011 23:48:30
Я не уверен в причине, но если я вызываю базовый класс, мое приложение вылетает после очередного нажатия Alt + F4. Сначала я думал, что это потому, что обычный F4 имеет какое-то другое значение в моем приложении, но длительный сеанс отладки показал обратное. Во всяком случае, это все еще может быть конкретный случай на моей стороне. Спасибо за этот отличный ответ.
Bahadır Yağan 28.04.2011 20:30:11
Вызов базового класса также приводит к сбою приложения на последующих Alt + F4. Я подозреваю, что базовый класс не проверяет e.Cancel и все равно пытается уничтожить форму.
Natan Yellin 24.05.2011 15:46:19
Вам нужно выяснить, почему ваше приложение дает сбой - скорее всего, вы делаете что-то не так в другом месте. В документах говорится «Событие FormClosing наступает при закрытии формы. Когда форма закрывается, она удаляется, освобождая все ресурсы, связанные с формой. Если вы отмените это событие, форма останется открытой. Для отмены закрытия установите для свойства Cancel свойства FormClosingEventArgs, переданных в обработчик событий, значение true. " tinyurl.com/3tb7y9q
antsyawn 26.05.2011 04:06:33

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

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

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

3
5.03.2013 04:45:40

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

this.ControlBox = false;
-3
19.06.2016 17:30:48

Это взломать, чтобы отключить Alt+ F4.

private void test_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.ModifierKeys == Keys.Alt || this.ModifierKeys == Keys.F4) 
    { 
        e.Cancel = true; 
    }    
}
6
5.02.2019 18:10:45
Я могу подтвердить, что это работает. Однако при использовании System.Windows.Formsвам нужно будет проверить статическое Control.ModifierKeysсвойство, а не this.ModifierKeysсвойство (как показано во фрагменте выше).
Special Sauce 14.09.2019 00:14:59

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

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


}
3
31.05.2018 00:57:47