Нет, невозможно запретить диспетчеру задач закрывать ваше приложение. Диспетчер задач может принудительно завершить процесс, который не отвечает; ему не нужно разрешение приложения, чтобы закрыть его, и оно тоже не спрашивает. (См. этот ответ для получения дополнительной информации о диспетчере задач и сравнение различных способов закрытия приложения.)
Единственный возможный обходной путь - это иметь два процесса, каждый из которых сконфигурирован для обнаружения, когда другой закрыт, и запуска нового экземпляра. Конечно, это все равно не остановит уничтожение одного из процессов, оно просто позволит вам перезапустить его. И это, вероятно, попадает в категорию враждебного поведения пользователя. Если я прибегнул к использованию диспетчера задач, чтобы закрыть ваше приложение, я бы хотел, чтобы оно исчезло, независимо от того, что вы, как программист, намеревались. И я гарантированно схожу с ума, если он продолжает раскручивать новые процессы (вероятно, сумасшедшим будет и мой антивирусный сканер, потому что он видел такое поведение раньше).
Я рекомендую пересмотреть дизайн вашего приложения. Если вам нужно что-то, что постоянно работает в фоновом режиме, вы должны создать службу Windows. Конечно, сервисы не имеют пользовательского интерфейса, и кажется, что ваше приложение требует его. Еще лучше написать защитный код: сохраните состояние приложения, чтобы его можно было закрыть и восстановить по желанию. Вы должны справиться со случаем, когда компьютер все равно выключается, так как трудно справиться только с тем, что ваше приложение закрывается?
Как сказал бы Microsoft Раймонд Чен , в Windows нет механизма для этого, потому что никто не мог представить себе приложение настолько потрясающим, как ваше, которое ни один пользователь никогда не захочет закрыть.
Что касается отключения окна закрытия формы, значка закрытия в системном / оконном меню и нажатия клавиши Alt + F4 , это относительно просто. Вам нужно переопределить свойство CreateParams
вашей формы и установить стиль класса окна CS_NOCLOSE
:
protected override CreateParams CreateParams
{
get
{
const int CS_NOCLOSE = 0x200;
CreateParams cp = base.CreateParams;
cp.ClassStyle |= CS_NOCLOSE;
return cp;
}
}
Скомпилируйте и запустите. Вы получите форму, которая выглядит следующим образом (обратите внимание на отключенную кнопку закрытия на панели заголовков и отсутствие пункта меню «Закрыть» в системном / оконном меню):
Обратите внимание, что при этом вы действительно должны предоставить альтернативный механизм в интерфейсе вашего приложения для закрытия формы. Например, в «основной» форме, из которой отображался этот диалог.