【问题标题】:How does task manager kill my program?任务管理器如何杀死我的程序?
【发布时间】:2012-03-17 17:34:56
【问题描述】:

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

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

我了解任务管理器用于终止进程的方法很少。

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

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

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

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

提前谢谢你。

【问题讨论】:

    标签: c++ winapi mfc taskmanager


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我真的没有回复任务管理器发送的 WM_CLOSE 消息。我找到了afx_msg void OnClose(); 的 EMPTY 实现,我所要做的就是调用基类的 OnClose 实现。
    【解决方案2】:

    是的,这些是选项。

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

    请注意,您不能拦截或响应TerminateProcess。您的进程将终止,在此之前您无能为力。实际上,应该是pretty bad if you could。因为那样就没有办法终止一个失控的进程。

    【讨论】:

    • 很高兴知道!非常感谢,我同意 TerminateProcess 的解释。
    • 值得补充的是,从“详细信息”选项卡中的任务管理器中终止进程只会执行TerminateProcess,而无法处理CTRL_CLOSE_EVENT。如果您从“进程 -> 应用程序”选项卡中执行“结束任务”,请确保在进程树的根目录中执行此操作,否则您可能同样无法处理该事件。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      (取决于您希望实现这一目标的程度,请查看this link 关于挂钩到 Windows API 的信息,但不要指望它会很容易。)

      【讨论】:

      • 感谢您的回答,实际上,当从“应用程序”选项卡中终止我的进程时,我没有回复任务管理器发送的 WM_CLOSE。从进程选项卡(通过 TerminateProcess 函数)杀死我的进程并没有使我的应用程序崩溃。
      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多