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

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

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

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

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

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

正如微软的Raymond Chen所告诉你的那样,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; } } 

编译并运行。 您将获得一个如下所示的表单(请注意标题栏上的禁用关闭按钮以及系统/窗口菜单中没有“关闭”菜单项):

具有CS_NOCLOSE样式的表单

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

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

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

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

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

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

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

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

如果还是必要的话,我可以为你提供代码。