Каков наилучший способ отключить 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);
. Таким образом, вы гарантируете, что не закроете, только когда ПОЛЬЗОВАТЕЛЬ попытается закрыть форму. Вы можете обработать FormClosing
событие и установить FormClosingEventArgs.Cancel
в true
.
Будет ли вызываться FormClosing, даже если вы программно закрываете окно? Если это так, вы, вероятно, захотите добавить некоторый код, позволяющий закрывать форму после ее завершения (вместо того, чтобы всегда отменять операцию)
Обратите внимание, что приложение считается плохой формой, чтобы полностью не закрыться. Вам следует проверить аргументы события закрытия, чтобы определить, как и почему ваше приложение попросили закрыть. Если это происходит из-за выключения Windows, вам не следует препятствовать закрытию.
Я использую форму в качестве всплывающего диалогового окна для отображения индикатора выполнения, и я не хочу, чтобы пользователь мог закрыть его.
Если пользователь полон решимости закрыть ваше приложение (и обладает достаточными знаниями), чтобы нажать alt + f4, он, скорее всего, также будет достаточно опытным, чтобы запустить диспетчер задач и убить ваше приложение.
По крайней мере, с помощью alt + f4 ваше приложение может сделать постепенное отключение, а не просто заставить людей убить его. Исходя из опыта, люди, убивающие ваше приложение, означают испорченные файлы конфигурации, поврежденные базы данных, неполные задачи, которые вы не можете возобновить, и многие другие болезненные вещи.
По крайней мере, попросите их сказать «Вы уверены», а не вывести их из строя?
Если вы посмотрите на значение из FormClosingEventArgs e.CloseReason
, он расскажет вам , почему форма закрывается. Затем вы можете решить, что делать, возможные значения:
Имя участника - Описание
Нет - причина закрытия не была определена или не может быть определена.
WindowsShutDown - операционная система закрывает все приложения перед выключением.
MdiFormClosing - родительская форма этой формы интерфейса с несколькими документами закрывается.
UserClosing - пользователь закрывает форму через пользовательский интерфейс, например, нажав кнопку «Закрыть» в окне формы, выбрав «Закрыть» в меню управления окна или нажав « 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);
}
Подписаться FormClosing событие
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = e.CloseReason == CloseReason.UserClosing;
}
Только одна строка в теле метода.
Скрыть кнопку закрытия на форме, используя следующие в конструкторе формы:
this.ControlBox = false;
Это взломать, чтобы отключить 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;
}
}