Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测使用C#代码[windows服务]启动的进程_C#_Windows Services - Fatal编程技术网

如何检测使用C#代码[windows服务]启动的进程

如何检测使用C#代码[windows服务]启动的进程,c#,windows-services,C#,Windows Services,我正在尝试设计一个windows服务,它监视一个进程,即“Gtalk”,如果该进程启动,浏览器Internet explorer(进程iexplore)应该关闭。这应该只在进程“Gtalk”启动时发生,[而不是在运行时] 我编写和实现的代码不允许在Gtalk运行时打开IExplore。这当然不是我想要的。流程Gtalk应该仅在启动时关闭浏览器,流程启动后,它应该允许打开IExplore 是否可以使用Windows服务,或者它必须是Gtalk进程本身的一部分 这是我的代码: while (tru

我正在尝试设计一个windows服务,它监视一个进程,即“Gtalk”,如果该进程启动,浏览器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();
                    }
                }
           }
不必去问“为什么”,为了得到你想要的东西,你必须保留一个“已知”过程的列表

例如,为进程名为
GTalk
的进程保留一个您看到的进程ID列表。然后,只有当您看到出现一个名为
GTalk
的进程,并且该进程的进程ID号不在您的列表中时,才可以将其添加到列表中,并执行
IExplore
kill操作

此外,请确保不要成为处理器猪,在Windows服务中编写这样一个紧密的无休止的循环。但是这与你的问题没有特别的关系。

如果不讨论这整个努力的“为什么”,要得到你似乎想要的东西,你必须保留一个“已知”过程的列表

例如,为进程名为
GTalk
的进程保留一个您看到的进程ID列表。然后,只有当您看到出现一个名为
GTalk
的进程,并且该进程的进程ID号不在您的列表中时,才可以将其添加到列表中,并执行
IExplore
kill操作

此外,请确保不要成为处理器猪,在Windows服务中编写这样一个紧密的无休止的循环。但这与你的问题并没有特别的关系。

从你所说的(可能我误解了),只有在GTalk启动时,这才应该杀死IE,然后IE才能启动。是否可以运行多个GTalk实例

你控制GTalk代码吗?听起来它最好在GTalk启动过程中实现

如果不是,那么@peSHIr检查检测到的GTalk进程是否是您已经看到的进程的方法可能是您的最佳选择

但是,即使只有一个GTalk实例可以运行,您也需要首先中断执行IE kill一次的代码(可能存储GTalk进程ID),然后定期检查(可能使用计时器)GTalk进程是否正在运行,如果没有(或者如果是但具有不同的进程ID)你会再次运行IE kill代码

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

请注意,此计时器对象是一次性的, 这里有一个简单的例子

//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表示立即运行,最后一个参数是以毫秒为单位的运行间隔。根据您的说法(可能我误读了),只有在启动GTalk时,这才应该杀死IE,然后IE才能启动。是否可以运行多个GTalk实例

你控制GTalk代码吗?听起来它最好在GTalk启动过程中实现

如果不是,那么@peSHIr检查检测到的GTalk进程是否是您已经看到的进程的方法可能是您的最佳选择

但是,即使只有一个GTalk实例可以运行,您也需要首先中断执行IE kill一次的代码(可能存储GTalk进程ID),然后定期检查(可能使用计时器)GTalk进程是否正在运行,如果没有(或者如果是但具有不同的进程ID)你会再次运行IE kill代码

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

请注意,此计时器对象是一次性的, 这里有一个简单的例子

//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表示立即运行,最后一个参数是以毫秒为单位的时间间隔,用于计算此操作的运行频率

我刚刚编写了一个示例。我知道在Gtalk启动时关闭Iexplore没有任何意义。在这种情况下,您应该将示例进程命名为
A
B
,或者
foo
bar
,或者。。。不管这个名字叫什么。使用
GTalk
IExplore
时,如果这些不是您正在使用的实际过程,则可能会让潜在的回答者假设一些事情,给他们的答案涂上颜色我刚刚写了一个例子。我知道在Gtalk启动时关闭Iexplore没有任何意义。在这种情况下,您应该将示例进程命名为
A
B
,或者
foo
bar
,或者。。。不管这个名字叫什么。使用
GTalk
IExplore
时,如果这些不是您正在使用的实际过程,则可能会让潜在的回答者假设一些事情,给他们的答案涂上颜色好。我刚才提到的只是一个例子,请不要担心关闭的原因,即当Gtalk启动时。我已经实现了
Thread.Sleep(1000)在我的服务中。谢谢你的回复。我试着实现它+1.Thread.Sleep也可能不是最好的方法,计时器会更好。我刚才提到的只是一个例子,请不要担心关闭的原因,即当Gtalk启动时。我已经实现了
Thread.Sleep(1000)在我的服务中。谢谢你的回复。我试着实现它+1.Thread.Sleep可能也不是最好的方法,计时器会是一个更好的选择-