任务管理器是如何结束我的程序的?

8
我有一个MFC程序,当我用任务管理器关闭它时,我的程序会出现异常然后崩溃。我想得到来自任务管理器的事件,当它将要终止我的进程并优雅地关闭我的程序。
我知道任务管理器在终止进程时使用了几种方法:
1) 从应用程序选项卡中,有人告诉我它向我的应用程序的主可见窗口发送WM_CLOSE消息。如果我的应用程序在几秒钟内仍未关闭,则任务管理器会检测为不响应并使用TerminateProcess()终止其进程。
2) 从进程选项卡中,有人告诉我它使用了TerminateProcess() Windows API。
任务管理器是否还有其他方法?
最后两个方法是正确的吗?
谢谢您的帮助。
4个回答

8

是的,这两种方法都是正确的。你应该响应WM_CLOSE以平稳关闭。这可能来自任何地方,而不仅仅是任务管理器(例如关机)。

MFC通常处理WM_CLOSE。如果您的应用程序没有响应,则您的主线程必须在执行其他操作,或者更有可能从您的描述中,在WM_CLOSE处理程序中某个地方发生了崩溃。

您能否调试您的应用程序以找到异常被引发的位置?


1
谢谢,我真的没有响应任务管理器发送的WM_CLOSE消息。我发现了一个空的afx_msg void OnClose();实现,我只需要调用基类的OnClose实现即可。 - eladyanai

3

是的,这些都是选项。

完整性起见,请注意,控制台模式应用程序在单击“结束任务”按钮时会接收到CTRL_CLOSE_EVENT发送,您可以对其进行反应。

请注意,您无法拦截或对TerminateProcess做出反应。您的进程将停止,并且在此之前您无能为力。实际上,如果您可以这样做,情况将变得非常糟糕。因为那样就没有办法终止失控的进程了。


非常好的了解!非常感谢,我也同意关于 TerminateProcess 解释的观点。 - eladyanai
值得注意的是,在任务管理器的“详细信息”选项卡中终止进程只会执行TerminateProcess,而无法处理CTRL_CLOSE_EVENT。如果你在“进程 -> 应用程序”选项卡中选择“结束任务”,请确保在进程树的根节点上执行此操作,否则同样可能无法处理该事件。 - ceztko

2
任务管理器内部使用EndTask函数。该函数向您的应用程序发送WM_CLOSE消息。如果您的应用程序不响应该消息并且用户强制终止您的应用程序,则会在您的进程上调用TerminateProcess

1

当你得到一个WM_CLOSE时,你可以轻松地检测它,并让你的应用程序对其做出响应。

我不认为有可能知道何时调用TerminateProcess来终止你的应用程序。 TerminateProcess 文档说明它是目标进程的立即和无条件关闭。

(根据你想实现多少,可以查看this link关于钩入Windows API,但不要期望它会很容易。)


谢谢你的答复,实际上,我没有响应任务管理器发送的 WM_CLOSE 消息- 当我从“应用程序”选项卡中终止我的进程时。 通过 TerminateProcess 函数从“进程”选项卡中终止我的进程并没有导致我的应用程序崩溃。 - eladyanai

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