如何阻止用户关闭我的C#应用​​程序?

时间:2011-01-11 08:58:05

标签: c# .net winforms formclosing

如何在C#中制作未关闭的应用程序?我想禁用表单的“X”按钮,并阻止Windows任务管理器关闭它。

我知道防止表单关闭的一种方法是处理FormClosing事件,但是如何阻止任务管理器关闭它?

4 个答案:

答案 0 :(得分:23)

不,无法阻止任务管理器关闭您的应用程序。任务管理器可以强制终止没有响应的进程;它不需要应用程序的许可来关闭它,它也不会很好地问。 (有关任务管理器的更多信息,请参阅this answer,以及可以关闭应用程序的不同方式之间的比较。)

唯一可以想到的解决方法是拥有两个进程,每个进程都配置为检测另一个进程何时关闭并启动新实例。当然,这仍然不会阻止其中一个进程被杀死,它只会让你重新启动它。这可能属于用户敌对行为的范畴。如果我使用任务管理器关闭你的应用程序,我可能希望它消失,无论你是程序员想要的是什么。如果它不断开始新的流程(我的病毒扫描程序可能很疯狂,因为之前就已经看到过这种行为了),我保证会生气。

我建议您重新考虑您的应用程序的设计。如果您需要在后台运行的所有东西,您应该创建一个Windows服务。当然,服务没有用户界面,您的应用程序似乎需要一个用户界面。更好的是,防御性地编写代码:保存应用程序的状态,以便可以随意关闭和恢复它。您必须处理计算机正在关闭的情况,那么处理关闭的应用程序有多难?

正如微软的Raymond Chen会告诉你的那样,Windows没有这样的机制,因为没有人能够想象一个应用程序像你那样真棒,没有用户想要关闭。< / p>


至于禁用表单的关闭框,系统/窗口菜单中的关闭图标以及 Alt + F4 击键,这是相对简单的。您需要覆盖表单的CreateParams property,然后设置CS_NOCLOSE window class style

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

请注意,在执行此操作时,您应该在应用程序的界面中提供替代机制来关闭表单。例如,在显示此对话框的“主”表单上。

答案 1 :(得分:9)

你永远不应该做这样的事情,但如果你真的需要这个,你应该创建一个服务。

答案 2 :(得分:4)

这不是问题的答案,但我认为重要的是要指出创建一个用户必须真正竭尽全力终止的应用程序并不总是无效的。如果内部私有应用程序设计为在公司拥有的机器上运行,并由使用该应用程序以员工身份开展工作的公司员工操作,那么强制应用程序始终保持运行是完全合法的。 @TvmMurthy问题似乎正在处理这种情况。

在我自己的工作中,MS Outlook作为我的工作站的一个启动应用程序启动,我让它一整天都在运行,并持续多天,直到我重启机器。我还编写了Windows窗体应用程序,让我了解我负责监视某些服务器的进程的状态。我编写这些应用程序是为了让它们始终保持运行状态,并且只有在检测到我需要了解的内容时才会将自己显示为弹出窗口(它们最小化到工具栏以防止它们被挡住)。我使用SharpReader来跟上我的RSS源,它自然地设计为不断运行。它最小化到工具栏,即使您单击红色X,也只能通过工具栏中的上下文菜单或使用任务管理器终止 - 这是完全合理的,甚至是预期的,因为它的功能!

Devs不应该假设所有应用程序都是自愿安装和使用的用户,他们可以自由运行他们想要的任何软件以及他们希望使用它们,或者他们自己的偏好是管理行业或其他用户的。管理应用程序行为的是业务需求,而不是开发人员的偏见。作为一名在工业界工作的开发人员,我被要求在软件中编写许多行为,如果我自己编写软件,我就不会写这些行为。

因为你不喜欢用户已被明确指示设计到他或她的应用程序中而忽略了一个问题,所以显示出一种不太特别值得称赞的小事或隐蔽性。提出质疑以抵消这种情况。

答案 3 :(得分:-1)

保护进程免受常规用户杀害并不困难。应用程序可以修改它自己的进程ACL,防止任何任务管理器将其终止。他们只会得到一个“访问被拒绝!”当试图杀死这个过程时。

但是,您应该总是允许管理员终止进程,因此它不会干扰系统关闭或其他管理任务。

如果仍然必要,我可以为您提供代码。