有没有办法通过Windows任务管理器的“结束进程”检测程序是否已经结束? 我知道在应用程序结束时不可能做到这一点(除了将你的应用程序构建为驱动程序并挂钩ZwTerminateProcess),但我想知道是否有办法从外部注意它。 我不想阻止程序终止,只是知道它是以“结束进程”结束的(而不是通过任何其他方式)。
答案 0 :(得分:1)
可能有更好的方法 - 但是如何使用简单的旗帜?
当然,你必须在进程/程序的内存之外的某个地方保留这个标志 - 比如注册表,数据库或文件系统。基本上,当应用程序启动时,当应用程序通过正常方式关闭时,您将标志设置为“True”,将标志设置为“False”。
每次应用程序启动时,您都可以检查该标志,看它是否在上一次执行时没有正确关闭。
答案 1 :(得分:1)
使用OpenProcess
打开进程句柄,然后使用WaitForSingleObject
之一等待函数等待该句柄。您可以使用GetExitCodeProcess
获取流程的退出状态。如果您需要程序在等待时保持对用户输入的响应,那么请确保在单独的线程上等待(或者您可以使用零超时定期轮询,但请记住the performance consequences of polling - 不推荐)。
完成后,请不要忘记致电CloseHandle
。在关闭所有句柄之前,不会从操作系统中完全删除过程对象,因此如果忘记调用CloseHandle
,则会泄漏资源。
请注意,无法区分正常退出流程或强行终止流程。即使你有一个约定,你的程序通常只有状态为0(成功)或1(失败),但其他一些进程可能会调用TerminateProcess(YourProcess, 1)
,这与普通的失败模式无法区分。 / p>
答案 2 :(得分:1)
根据文档,ExitProcess使用DLL_PROCESS_DETACH调用所有加载的DLL的入口点,而TerminateProcess则没有。 (退出main函数会导致调用ExitProcess,most unhandled exceptions也是如此。)
您可能还想查看Application Recovery and Restart。
答案 3 :(得分:0)
一个选项可能是创建一个“监视程序”应用程序(可能作为服务安装),它监视WMI事件以通过ManagementEventWatcher
类(在System.Management
命名空间中)停止进程。 / p>
您可以在一定时间间隔内查询流程的死亡情况,或者以事件驱动的方式提醒您流程的消亡。
Here's sort of an example(虽然它在C#中)可以让你开始。