我有这个MFC程序,当我用任务管理器杀了它时,我的程序出现异常,然后崩溃。
我希望从任务管理器获取该事件,当它要杀死我的进程并优雅地关闭我的程序时。
据我所知,任务管理器使用的方法很少,无法杀死进程。
1)在应用程序选项卡中,有人告诉我它正在向我的应用程序的主要可见窗口发送WM_CLOSE消息,如果我的应用程序在几秒钟后没有停止,则任务管理器将其检测为无响应并使用TerminateProcess( )关于它的过程。
2)在流程选项卡中,有人告诉我它正在使用TerminateProcess()windows API。
任务管理器是否正在使用其他任何方法?
我对最后两种方法是对的吗?
提前谢谢。
答案 0 :(得分:8)
是的,这两个都是正确的。您应该响应WM_CLOSE以正常关闭。这可能来自任何地方,而不仅仅是任务管理器(例如关机)。
MFC通常会处理WM_CLOSE。如果您的应用程序没有响应,那么您的主线程必须坐在其他地方,或者更可能是您的描述在WM_CLOSE处理程序中的某处崩溃。
您可以调试您的应用以查找引发异常的位置吗?
答案 1 :(得分:3)
是的,这些是选项。
为了完整性,请注意,当单击“结束任务”按钮时,控制台模式应用程序将获得您可以做出反应的CTRL_CLOSE_EVENT
发送。
请注意,您无法拦截或对TerminateProcess
作出反应。你的过程将会死亡,在此之前你无能为力。实际上,它将是pretty bad if you could。因为那时就没有办法终止一个乱七八糟的过程。
答案 2 :(得分:1)
当您获得WM_CLOSE时,您可以轻松检测到这一点,以便您的应用程序可以对其进行操作。
我不相信有可能知道何时调用TerminateProcess
来杀死你的应用程序。 TerminateProcess
文档说它是对目标进程的立即无条件关闭。
(根据您希望实现的目标,请查看this link关于挂钩到Windows API但不要指望它很容易。)
答案 3 :(得分:1)
任务管理器内部使用EndTask功能。此函数向您的应用程序发送WM_CLOSE消息。如果您的应用程序未响应该消息并且用户强制终止您的应用程序,则会在您的进程中调用TerminateProcess。