如何使用C#代码检测进程是否已启动[windows service]

时间:2010-03-18 10:26:38

标签: c# windows-services

我正在尝试设计监视进程即“Gtalk”的Windows服务,如果进程启动,则应关闭浏览器Internet-explorer(进程iexplore)。这应该仅在进程“Gtalk”启动时发生,[不运行时]

我编写和实现的代码不允许在Gtalk运行时打开IExplore。这当然不是我想要的。 Gtalk进程应该只在启动时关闭浏览器。进程启动后,它应该允许打开IExplore。

是否可以使用Windows服务,或者它必须是Gtalk流程本身的一部分吗?

这是我的代码:

 while (true)
          {

                if (Process.GetProcessesByName("Gtalk").Length > 0)
                {

                    foreach (Process prc in Process.GetProcessesByName("IExplore"))
                    {
                        prc.Kill();
                    }
                }
           }

2 个答案:

答案 0 :(得分:3)

没有进入“为什么?”为了获得你似乎想要的东西,你必须保留一份“已知”过程列表。

例如,保留一个进程ID列表,列出了以GTalk作为进程名称的进程。然后,只有当您看到具有GTalk名称的流程显示的流程ID号已经不在您的列表中时,您才会将其添加到列表中并执行IExplore kill操作。

另外,请确保不要成为处理器,在像这样的Windows服务中编写一个紧密的无限循环。但这与你的问题无关。

答案 1 :(得分:1)

根据你所说的(也许我误读了),只有在GTalk启动时才能杀死IE,之后IE就可以启动了。可以运行多个GTalk实例吗?

您是否控制GTalk代码?听起来它最好在GTalk启动过程中实现。

如果没有,那么@ peSHIr检查GTalk过程是否已经检测到的路线可能是您最好的选择。

然而,即使只有一个GTalk实例可以运行,你也需要打破首次运行时IE杀死的代码(可能存储GTalk进程ID),然后定期检查(可能使用计时器) GTalk进程正在运行,如果没有(或者如果它有不同的进程ID),你将再次运行IE kill代码

编辑:定时器使用的简单示例

请注意,此计时器对象是Disposable, 这是一个简单的例子;

//in startup code...
timer = new System.Threading.Timer(CheckProcessAndKillIeIfNeedBe, null, 0L, (long)TimeSpan.FromMinutes(1).TotalMilliseconds);

//some method elsewhere
public void CheckProccessAndKillIeIfNeedBe(object state)
{
  //do the process check and kill IE if conditions are met          
}

null = state,0L表示立即运行,最后一个参数是您应该运行的频率的间隔(以毫秒为单位)