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

时间:2009-12-04 02:29:35

标签: c# .net windows process c#-2.0

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

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

3 个答案:

答案 0 :(得分:5)

好吧,我明白了。使用.Net 2.0中的Process类无法直接访问父进程信息,但使用System.Diagnostics.PerformanceCounter类,您可以从“创建进程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的列表来跟踪生成的进程树,此示例仅监视一个直接子进程。

答案 1 :(得分:1)

如果那些其他进程是专有的/不在你的控制之内,我真的不知道如何监视它们是否产生了新的进程,如果你想检查衍生的进程是否产生了孙进程进程,那么更多。 ..(你知道我要去哪里)。

无论如何,我认为,它可能是可行的,我只是不认为它可以单独使用.NET / C#来实现。

希望其他人可以提供真正的解决方案。

答案 2 :(得分:1)

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

在这种情况下,我会选择使用WMI。你先开始吧 枚举现有流程[以太网方式,WMI或网络流程]并记住这些流程,你会看到。 然后启动两个WMI事件查询,一个使用 Win32_ProcessStartTrace 以及另一个查询 Win32_ProcessStopTrace [请参阅WMI SDK]。 两者都返回 Win32_Process 的实例,它始终包含 “ParentProcessID”。如果这是其中之一,你之前保存过, 你有衍生的过程。 “Win32_Process”也包含 一个“杀”方法;没有线索,你最终想做什么; - )

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

BR - mabra