当任务管理器结束任务wpf应用程序时检测/通知

时间:2016-03-12 16:50:33

标签: c# wpf winapi

当我的WPF应用程序从"任务管理器"中被杀死时,我只需检测 - > " 过程"选项卡,而不是来自"应用程序"标签

再次提到只需检测不停止或拦截!

一段C#代码就可以了。

1 个答案:

答案 0 :(得分:1)

正如@DavidHeffernan已告诉您,您必须使用另一个流程/服务,该流程/服务将使用How to detect win32 process creation/termination in c++中的一种技术检查您的流程终止。

您必须在开始实际应用程序时正确重新初始化此流程/服务。

但是如何理解你的过程已经强行终止并且没有和平关闭?

  1. 您可以尝试hook on TerminateProcess - 这不是最简单的方法(实际上可能是最难的方式之一),并且它本身不会处理NtTerminateProcess,所以... < / strike> - 遗憾的是,这不起作用 - Why can’t you trap TerminateProcess?
  2.   

    TerminateProcess是低级进程终止功能。它   绕过DLL_PROCESS_DETACH以及进程中的任何其他内容。一旦您   使用TerminateProcess终止,不会再运行用户模式代码   处理。没了。不要过去。不要收200美元。

    1. 使用某个同步对象会更好 - 最简单的方法是,只要应用程序正确关闭(手动或通过外部WM_CLOSE消息),它就会删除指示器目录。然后服务检查该目录是否存在(如果在服务检查指标目录之前重新启动应用程序,则实际上可能存在某些竞争条件)
    2. 作为2.的更高级变体,您可以使用由您的实际应用程序创建的命名互斥(或者更好的命名事件,如指向@IInspectable),并等待该互斥或process termination {{3 }}。它是一个比2更强大的解决方案,但可能有一些实现WaitForMultipleObject
    3. P.S。:在任何情况下,您都必须仔细考虑管理您的应用程序的服务。可能会出现种族条件和其他令人讨厌的事情。特别是如果您的应用程序可以在多个实例中启动。