为什么你不能拦截TerminateProcess?
如果用户打开了任务管理器,并在一个应用程序进程上点击了”结束任务”菜单项,Windows会首先尝试以一种温柔的方式来关闭这个应用程序,具体来说,就是通过向应用程序的主窗口发送WM_CLOSE消息。如果这个应用程序是一个控制台程序,则它会向程序发送CTRL_CLOSE_EVENT事件消息。应用程序有机会对这些消息进行拦截,从而继续执行。
但是,你没办法对TerminateProcess进行拦截。为什么?
TerminateProcess这个API是一个低层API,专门用来结束应用程序进程。一旦你通过TerminateProcess来结束某个进程,则不会有任何用户模式的代码会在这个进程中运行。此时,一切都结束了。
我们打个比方,如果你有某种方法来拦截TerminateProcess的调用,则这意味着你会升级应用程序和用户之间的军备竞赛。
假设你可以进行拦截,并希望你的应用程序是”无法结束的”,则你可能在TerminateProcess的处理代码中一直处于挂起状态。
这个时候,应用程序的用户可能会要求另外一种结束这种”顽固”程序的方法,这就又回到了我们最开始的地方。
后面我还有一篇文章,会讲述为什么有些程序即使被强制结束运行了,但它们还是会显示在任务管理器中。
敬请期待。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why can’t you trap TerminateProcess?》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
- 下一篇: 为什么被强制结束的进程还在任务管理器里?
- 上一篇: Win98为什么最多能支持9台显示器?
相关推荐
- 析构函数在什么情况下应该声明为虚函数
- Posted on 02月21日
- 第 509 期:微软 Windows 11 26H1 之上手初体验
- Posted on 02月19日
- 第 900 期:微软 CEO 确认 Windows 11 的重大质量更新,重点关注基础功能
- Posted on 07月31日
- 重量级消息:MSVC STL宣布开源
- Posted on 09月22日



评论已关闭。