8

我有这个 MFC 程序,当我用任务管理器杀死它时,我的程序出现异常,然后它崩溃了。

我想从任务管理器获取事件,当它要终止我的进程并优雅地关闭我的程序时。

我知道任务管理器使用几种方法来终止进程。

1)从应用程序选项卡,有人告诉我它正在向我的应用程序的主可见窗口发送 WM_CLOSE 消息,如果我的应用程序在几秒钟后没有关闭,任务管理器将其检测为无响应并在其上使用 TerminateProcess()过程。

2)从进程选项卡,有人告诉我它正在使用 TerminateProcess() windows API。

任务管理器还有其他方法吗?

我对最后两种方法是否正确?

先感谢您。

4

4 回答 4

8

是的,这两个都是正确的。您应该响应 WM_CLOSE 以优雅地关闭。这可能来自任何地方,而不仅仅是任务管理器(例如关闭)。

MFC 通常处理 WM_CLOSE。如果您的应用程序没有响应,那么您的主线程必须在做其他事情,或者根据您的描述更有可能在 WM_CLOSE 处理程序的某个地方崩溃。

您可以调试您的应用程序以找到引发异常的位置吗?

于 2012-02-28T08:47:20.783 回答
3

是的,这些是选项。

为了完整起见,请注意控制台模式应用程序会在CTRL_CLOSE_EVENT单击“结束任务”按钮时收到您可以做出反应的发送。

请注意,您不能拦截或对TerminateProcess. 您的进程将终止,在此之前您无能为力。实际上,如果可以的话,那将是非常糟糕的。因为那样就没有办法终止一个失控的进程。

于 2012-02-28T08:55:40.630 回答
2

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

于 2012-02-28T12:42:52.283 回答
1

当您获得 WM_CLOSE 时,您可以轻松检测到它,以便您的应用程序可以对其进行操作。

我不相信有可能知道什么时候TerminateProcess被调用来杀死你的应用程序。文档说这TerminateProcess是对目标进程的立即无条件关闭。

(根据您想要实现这一点的程度,请查看有关挂钩到 Windows API 的链接,但不要指望它很容易。)

于 2012-02-28T08:54:22.407 回答