我正在尝试设计监视进程即“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();
}
}
}
答案 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表示立即运行,最后一个参数是您应该运行的频率的间隔(以毫秒为单位)