Как отключить Alt + F4 закрытие формы?
Каков наилучший способ отключить Alt + F4 в форме aC# win, чтобы пользователь не мог закрыть форму?
Я использую форму в качестве всплывающего диалогового окна для отображения индикатора выполнения, и я не хочу, чтобы пользователь мог закрыть его.
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();
Если вы посмотрите на значение FormClosingEventArgs e.CloseReason
, он скажет вам, почему форма закрывается. Затем вы можете решить, что делать, возможные значения:
Имя участника - Описание
Нет - причина закрытия не была определена или не может быть определена.
WindowsShutDown - операционная система закрывает все приложения перед выключением.
MdiFormClosing - родительская форма этой формы интерфейса с несколькими документами закрывается.
UserClosing - пользователь закрывает форму через пользовательский интерфейс, например, нажав кнопку "Закрыть" в окне формы, выбрав "Закрыть" в меню управления окна или нажав 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
в 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 событие
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;
}
}
Будет ли вызываться FormClosing, даже если вы программно закрываете окно? Если это так, вы, вероятно, захотите добавить некоторый код, позволяющий закрывать форму после ее завершения (вместо того, чтобы всегда отменять операцию)
В обработчике событий FormClosing не могли бы вы запросить буфер клавиатуры (у вас даже есть доступ к этому?) Для se, если были нажаты [Alt] + [F4], отменить, если true, продолжить, если нет?
Скрыть кнопку закрытия на форме, используя следующие в конструкторе формы:
this.ControlBox = false;