不,无法阻止任务管理器关闭您的应用程序。任务管理器可以强制终止没有响应的进程;它不需要应用程序的许可来关闭它,而且它也没有很好地要求。 (看这个答案 https://stackoverflow.com/questions/10765197/what-is-the-difference-between-closing-an-application-and-ending-the-process-fro/10765274#10765274有关任务管理器的更多信息,以及关闭应用程序的不同方式之间的比较。)
唯一可以想到的解决方法是有两个进程,每个进程都配置为检测另一个进程何时关闭并启动一个新实例。当然,这仍然不会阻止其中一个进程被终止,它只会允许您重新启动它。这可能属于用户敌对行为的范畴。如果我求助于使用任务管理器来关闭您的应用程序,我可能希望它消失,无论您作为程序员的意图是什么。如果它不断启动新进程,我肯定会生气(我的病毒扫描程序也可能会生气,因为它以前见过这种行为)。
我建议您重新考虑应用程序的设计。如果您需要始终在后台运行的东西,您应该创建一个 Windows 服务。当然,服务没有用户界面,但您的应用程序似乎需要一个用户界面。因此,更好的是,防御性地编写代码:保存应用程序的状态,以便可以随意关闭和恢复它。无论如何,你都必须处理计算机关闭的情况,那么处理你的应用程序被关闭有多难呢?
正如微软的Raymond http://blogs.msdn.com/b/oldnewthing/archive/2010/07/21/10040699.aspx Chen http://blogs.msdn.com/b/oldnewthing/archive/2010/07/21/10040699.aspx会告诉您,Windows 没有相应的机制,因为没有人能够想象出一款像您的应用程序一样出色的应用程序,而没有用户愿意关闭。
As far as disabling your form's close box, the close icon in the system/window menu, and the Alt+F4 keystroke, this is relatively straightforward. You'll need to override your form's CreateParams property http://msdn.microsoft.com/en-us/library/system.windows.forms.form.createparams.aspx, and set the CS_NOCLOSE window class style http://msdn.microsoft.com/en-us/library/ff729176(v=VS.85).aspx:
protected override CreateParams CreateParams
{
get
{
const int CS_NOCLOSE = 0x200;
CreateParams cp = base.CreateParams;
cp.ClassStyle |= CS_NOCLOSE;
return cp;
}
}
编译并运行。您将得到一个如下所示的表单(请注意标题栏上禁用的关闭按钮以及系统/窗口菜单中缺少“关闭”菜单项):
请注意,执行此操作时,您确实应该在应用程序界面中提供替代机制来关闭表单。例如,在显示此对话框的“主”表单上。