我试图捕捉进程结束的时间(例如通过在任务管理器中杀死它)。为了当它检测到(在已结束的进程内)时,在退出做一些工作之前。我的应用并没有结束 byitslef (endless loop)
我试过:1)atexit 2)SetUnhandledExceptionFilter
我尝试在调试运行中简单地关闭运行的应用程序,但最终没有达到执行额外任务的目的。
帮助,
我试图捕捉进程结束的时间(例如通过在任务管理器中杀死它)。为了当它检测到(在已结束的进程内)时,在退出做一些工作之前。我的应用并没有结束 byitslef (endless loop)
我试过:1)atexit 2)SetUnhandledExceptionFilter
我尝试在调试运行中简单地关闭运行的应用程序,但最终没有达到执行额外任务的目的。
帮助,
这应该回答你的问题:
在任务管理器中有两种方法可以杀死应用程序。
通过应用程序选项卡杀死大致相当于 SIGTERM(在 Linux 中)。应用程序可能会拦截它并进行更多处理,因为它基本上是在发送“关闭窗口”消息。要捕获的消息是 WM_CLOSE。
通过进程选项卡杀死大致相当于 SIGKILL(在 Linux 中)。除了监视用户在任务管理器的列表框和结束进程按钮中的操作,或者拥有一个看门狗进程来查看第一个进程何时被杀死之外,您无能为力
枚举所有正在运行的进程。完成此操作后,您将获得进程 ID。通过之前获取的ID获取每个进程的句柄,找到你要找的进程。在单独的线程中使用相同的进程句柄,如下所示:
WaitForSingleObject(hProcess, INFINITE);
一旦进程终止,该线程将结束。
在控制台应用程序中,您应该考虑安装HandlerRoutine 回调函数来捕获 CTRL_C_EVENT、CTRL_BREAK_EVENT、CTRL_CLOSE_EVENT、CTRL_LOGOFF_EVENT、CTRL_SHUTDOWN_EVENT。
在 GUI 应用程序中,您应该考虑处理WM_CLOSE、WM_QUERYENDSESSION、WM_ENDSESSION。