Thi*_*u G 4 .net c# winforms formclosing
如何在C#中使用unclosed应用程序?我想禁用表单的"X"按钮,并阻止Windows任务管理器关闭它.
我知道阻止表单关闭的一种方法是处理FormClosing事件,但是如何阻止任务管理器关闭它?
Cod*_*ray 23
不,不可能阻止任务管理器关闭您的应用程序.任务管理器可以强制终止没有响应的进程; 它不需要应用程序的许可来关闭它,它也不会很好地问.(有关任务管理器的更多信息,请参阅此答案,以及可以关闭应用程序的不同方式之间的比较.)
唯一可以想到的解决方法是拥有两个进程,每个进程都配置为检测另一个进程何时关闭并启动新实例.当然,这仍然不会阻止其中一个进程被杀死,它只会让你重新启动它.这可能属于用户敌对行为的范畴.如果我使用任务管理器关闭你的应用程序,我可能希望它消失,无论你是程序员想要的是什么.如果它继续开辟新流程(我的病毒扫描程序可能很疯狂,因为它之前已经看到过这种行为),我保证会生气.
我建议您重新考虑您的应用程序的设计.如果您需要在后台运行的所有东西,您应该创建一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
编译并运行.您将获得一个如下所示的表单(请注意标题栏上的禁用关闭按钮以及系统/窗口菜单中没有"关闭"菜单项):

请注意,执行此操作时,您应该在应用程序的界面中提供替代机制来关闭表单.例如,在显示此对话框的"主"表单上.
你永远不应该做这样的事情,但如果你真的需要这个,你应该创建一个服务.
这不是问题的答案,但我认为指出这一点可能很重要:创建用户必须竭尽全力才能终止的应用程序并不总是无效的。如果内部私有应用程序设计为在公司拥有的机器上运行并由公司员工操作,这些员工使用该应用程序以员工身份完成工作,则强制该应用程序始终保持运行是完全合法的。@TvmMurthy 问题似乎正在处理这种情况。
在我自己的工作中,MS Outlook 作为我工作站的启动应用程序之一启动,我让它运行一整天,甚至持续几天,直到我重新启动计算机。我还编写了 Windows 窗体应用程序,让我了解我负责监视的某些服务器上的进程的状态。我编写这些应用程序是为了始终保持运行状态,并且仅在检测到我需要了解的内容时才将其显示为弹出窗口(它们最小化到工具栏以防止它们妨碍)。我使用SharpReader来跟上我的 RSS 提要,它自然被设计为持续运行。即使您单击红色 X,它也会最小化到工具栏,并且只能通过工具栏的上下文菜单或使用任务管理器来终止 - 考虑到其功能,这是完全合理的,甚至是预期的!
开发人员不应假设所有应用程序都是由用户自愿安装和使用的,这些用户可以自由运行他们想要的任何软件以及何时使用它,或者他们自己的偏好是管理行业或其他用户的。管理应用程序行为的是业务需求,而不是开发人员的偏见。作为一名在工业界工作的开发人员,我被要求将许多行为写入软件中,如果我自己编写软件,我就不会编写这些行为。
因为您不喜欢用户明确指示在其应用程序中设计的内容而对问题投反对票,这会显示出一种不值得特别赞扬的狭隘或封闭态度。已投票的问题来抵消这一点。
| 归档时间: |
|
| 查看次数: |
15646 次 |
| 最近记录: |