Как я могу запретить пользователю закрывать мое приложение C #? - PullRequest
4 голосов
/ 11 января 2011

Как сделать закрытое приложение в C #? Я хочу отключить кнопку «X» формы и запретить ее также закрывать диспетчеру задач Windows.

Я знаю, что один из способов предотвратить закрытие формы - это обработать событие FormClosing, но как мне предотвратить его закрытие диспетчером задач?

Ответы [ 4 ]

23 голосов
/ 11 января 2011

Нет, невозможно запретить диспетчеру задач закрывать ваше приложение. Диспетчер задач может принудительно завершить процесс, который не отвечает; ему не нужно разрешение приложения, чтобы закрыть его, и оно тоже не спрашивает. (См. этот ответ для получения дополнительной информации о диспетчере задач и сравнение различных способов закрытия приложения.)

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

Я рекомендую пересмотреть дизайн вашего приложения. Если вам нужно что-то, что постоянно работает в фоновом режиме, вы должны создать службу 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;
   }
}

Скомпилируйте и запустите. Вы получите форму, которая выглядит следующим образом (обратите внимание на отключенную кнопку закрытия на панели заголовков и отсутствие пункта меню «Закрыть» в системном / оконном меню):

Form with CS_NOCLOSE style

Обратите внимание, что при этом вы действительно должны предоставить альтернативный механизм в интерфейсе вашего приложения для закрытия формы. Например, в «основной» форме, из которой отображался этот диалог.

9 голосов
/ 11 января 2011

Вы никогда не должны делать подобные вещи, но если вам это действительно нужно, вы должны создать сервис.

4 голосов
/ 19 декабря 2011

Это не ответ на вопрос, но я думаю, что было бы важно отметить, что не всегда недопустимо создавать приложение, которое пользователь должен действительно приложить к большим усилиям, чтобы завершить работу.В случае внутреннего частного приложения, которое предназначено для работы на машинах, принадлежащих компании и управляемых сотрудниками компании, которые используют приложение для выполнения своей работы в качестве сотрудников, было бы совершенно законным заставить приложение всегда оставаться запущенным,@TvmMurthy вопрос, похоже, касается именно этой ситуации.

В моей собственной работе MS Outlook запускается как одно из приложений для запуска моей рабочей станции, и я оставляю его включенным весь день, и в течение нескольких дней, пока яперезагрузите машину.Я также написал приложения для Windows Form, которые информируют меня о состоянии процессов, которые я несу ответственность за мониторинг на некоторых наших серверах.Я написал эти приложения, чтобы они постоянно работали, и проявляют себя как всплывающие окна только тогда, когда обнаруживается что-то, о чем мне нужно знать (они сводятся к панели инструментов, чтобы не мешать им).Я использую SharpReader , чтобы не отставать от своих RSS-каналов, и он, естественно, предназначен для постоянной работы.Он сворачивается в панель инструментов, даже если вы щелкнете по красному значку X, и может быть прекращен только с помощью контекстного меню на панели инструментов или с помощью диспетчера задач - и это вполне разумно, даже ожидаемо, учитывая его функцию!

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

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

0 голосов
/ 01 октября 2015

Это не так сложно защитить процесс от гибели обычных пользователей.Приложение может изменить свой собственный ACL-процесс, предотвращая его уничтожение ЛЮБЫМ диспетчером задач.Они просто получат «Доступ запрещен!»при попытке завершить процесс.

Однако следует всегда разрешать администраторам иметь возможность завершать процесс, чтобы он не мешал выключению системы или другим административным задачам.

Я мог бы предоставитьВы с кодом, если все еще необходимо.

...