在Windows(.NET)中,有没有一种拦截进程“Kill”命令的方法?

3

我有一个使用.NET 4.0 (c#)编写的Windows控制台应用程序,如果应用程序/进程异常终止(例如从任务管理器中终止或通过操作系统关闭),是否有办法拦截此操作以便执行一些清理代码?

谢谢任何帮助。


如果整个进程正在关闭,尝试执行清理操作会有多安全,请在评论中进行说明。 - Anthony Pegram
请查看此链接:https://dev59.com/pXRA5IYBdhLWcg3wwwzD 虽然 .net 的版本不同,但概念仍然适用。 - seth
3个回答

4
您无法检测到自己的进程被终止。当有人使用NtTerminateProcess()关闭您的进程并且他们有权限这样做时,您不会得到通知。您的所有线程都会停止,您的进程也会从您身下消失。
值得庆幸的是,大多数清理工作不需要手动完成 - 所有您没有释放的内存将被操作系统回收,您没有关闭的所有系统句柄将自动清理,您打开为TEMPORARY的所有临时文件(您确实这样做了吧?)将自动删除。
原因很简单。如果您决定通过任务管理器结束程序 - 那是因为用户已经决定它行为异常。如果您告诉它停止行为异常,那么它可能会忽略您,因为它正在行为异常。
似乎更好的处理进程的方式是提供一个合法的退出进程的方法 - 通过处理WM_CLOSE事件的窗口或在可以通过角落的红色X按钮中止的控制台中运行它。任务管理器应该是最后的手段。如果用户费尽心思地Ctrl+Alt+Del杀死您的进程,您就没有第二次机会了。

2

0

通常情况下,没有办法处理正在被终止的进程,但您应该能够处理应用程序退出时发生的事件。(想一想:如果您可以处理被终止的进程,那么编写一些可怕的间谍软件类型的东西将变得非常容易)。如果我没记错的话,有一种方法可以检查应用程序关闭的原因。根据导致其关闭的原因,您可以采取不同的反应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接