在C#.Net 2.0中,是否有方法检测一个进程是否/何时启动另一个进程?

在C#.Net 2.0中,是否有方法检测一个进程是否/何时启动另一个进程?,c#,.net,windows,process,c#-2.0,C#,.net,Windows,Process,C# 2.0,我正在寻找一种方法来检测由我的应用程序启动的进程是否产生了其他进程。希望我可以有一个线程来启动应用程序,监视它直到退出,然后在应用程序退出时触发其他一些操作。问题是,对于我想要监视的一些应用程序,它们正在启动一个额外的进程,然后退出。因此,我的触发器在应用程序退出之前触发 例如,我在一个进程中启动一个程序。该可执行文件进行一些文件修补,然后启动主程序(一个单独的exe),然后退出。这会导致Process.HasExited返回true,从而过早触发我的触发器。我真正关心的是主程序何时退出,在本例

我正在寻找一种方法来检测由我的应用程序启动的进程是否产生了其他进程。希望我可以有一个线程来启动应用程序,监视它直到退出,然后在应用程序退出时触发其他一些操作。问题是,对于我想要监视的一些应用程序,它们正在启动一个额外的进程,然后退出。因此,我的触发器在应用程序退出之前触发


例如,我在一个进程中启动一个程序。该可执行文件进行一些文件修补,然后启动主程序(一个单独的exe),然后退出。这会导致Process.HasExited返回true,从而过早触发我的触发器。我真正关心的是主程序何时退出,在本例中是初始进程启动的程序,但我似乎找不到一种方法以编程方式完成此操作。

如果这些其他进程是专有的/不在您的控制范围内,我真的看不到您如何监控它们,检查它们是否产生了新进程,更重要的是,如果您想检查生成的进程是否生成子进程以及。。。(你知道我要去哪里)

无论如何,这是我的观点,它可能是可以做到的,我只是不认为它可以单独使用.NET/C实现


希望其他人能提供一个真正的解决方案。

好的,我想出来了。使用.Net 2.0中的process类无法直接访问父进程信息,但使用该类可以从“Creating process id”计数器名称访问父进程id。为了解决我的问题,我做了类似的事情:

...
/// check to see if the monitored application (started in myProcess) is still running
public bool isRunning()
{
    bool running = !this.myProcess.HasExited;
    if(!running){
        foreach (Process p in Process.GetProcesses())
        {
            PerformanceCounter pc = new PerformanceCounter("Process", "Creating Process Id", p.ProcessName);
            if (this.myProcess.Id == (int)pc.RawValue)
            {
                running = true;
            }
        }
    }
    return running;
}
...

在本例中我省略了错误处理,作为一种更高级的解决方案,您可以通过维护所有分支进程ID的列表来跟踪生成的进程树,本例仅监视一个直接子进程。

我认为,这不是很简单,但可行

在这种情况下,我会选择使用WMI。你先开始 枚举现有进程[以太方式、WMI或Net进程]并记住这些进程,您将看到。 然后启动两个WMI事件查询,一个使用Win32_ProcessStartTrace 另一个用于查询Win32_ProcessStopTrace[请参阅WMI SDK]。 两者都返回Win32_进程的实例,该实例始终包含 “ParentProcessID”。如果这是其中之一,你以前保存过, 您拥有衍生流程。“Win32_进程”还包含 “杀戮”方法;不知道,你最后想做什么;-)

希望,这有帮助。请不要犹豫,询问更多细节


br--mabra

我看不出如何用通用的方法来实现。对于一些产卵过程来说,这是可行的,但是如果产卵过程不是在你的控制之下……你提到它可能是无法实现的。使用.NET/C单独,任何关于实现与C++相似的想法,作为替代,有一个方法来查看过程列表中的每个过程并确定它是不知何故起源的。(直接或间接)从特定的进程id?