2012-12-06 50 views
0

我试图启动一个浏览器实例作为从一个C#代码的过程。那么我想杀死浏览器的同一个实例。我试图找到与进程ID相同的实例。但是进程ID在任务管理器和我开始进程时获得的初始ID方面有所不同。 解决方案是什么?为什么发生这种情况?开发环境是windows 7.问题与启动和杀死一个进程在Windows 7

int ID= 0; 
    void Start() 
    { 
     ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe"); 
     startInfo.Arguments = "http://www.google.com"; 
     Process ieProcess = Process.Start(startInfo); 
     ID= ieProcess.Id; 
    } 
    void Stop() 
    { 
    foreach (Process p in System.Diagnostics.Process.GetProcessesByName("iexplore")) 
    { 
     if ((p.Id == ID)) 
     { 
       p.Kill(); 
     } 
    } 
+0

afaik当您通过此方法启动Internet Explorer时(如果已启动Internet Explorer),它将向另一个页面发送另一个页面消息,以便您启动的进程将打开并关闭。虽然我可能错了 –

+0

对不起。我没有得到 – user1687824

+1

不要这样做。使用自动化界面。然后你可以调用'Quit'关闭IE窗口。 –

回答

0

为什么不把代码添加到问题中?对于那些有兴趣帮助你的人来说,这将使生活变得轻松。如果你得到不同的PID,很可能你的代码出了问题! (我只是猜测而没有看到你试过的东西。)

看看这些问题以及。
1)Getting PID of process started by Process.start()
2)Programmatically kill a process in vista/windows 7 in C#
3)Process.kill() denied in Windows 7 32bits even with Administrator privileges



添加代码,使得它更容易理解的问题是什么,这里是你的问题。

IE为程序的一个实例创建多个进程。 (more details about it)这就是为什么你得到不同的PID(针对不同的进程)。

您的代码所做的只是查杀它的一个进程(通过在Stop()方法中使用if条件!)。因此,当您尝试再次执行Start()时,其余进程可能会生成InvalidOperationException(启动相同的进程)!

所以你的代码应该做的是杀死所有活动的iexplore进程。这可以通过简单地删除Stop()方法的if条件来完成。

foreach(Process p in Process.GetProcessesByName("iexplore")) 
{ 
    p.Kill(); 
} 

让我知道这是否奏效。

+0

我已添加代码。请检查 – user1687824

+0

感谢您的答复。但问题是我不想要其他选项卡被关闭。我只想启动一个链接,一段时间后我想关闭它。有没有什么方法可以存储已启用的实例并重新启动? – user1687824

+0

在这种情况下,您将必须知道您需要关闭的选项卡的PID(s)!我不认为有可能获得特定标签的PID! – CRoshanLG

0

我有一个类似的问题,只是我不想杀死IE进程,我开始了,我想将其引入重点。 我有一个应用程序,启动5个IE窗口(不是标签,但是独特的窗口) 我存储了PID,我开始每个IE窗口。 在特定的时间,我希望能够到:

  • 选择PID,
  • 找到与该PID的IE窗口
  • 使其焦点(最小化等)

这个工作使用XP和IE6(环境要求) 现在,当我使用Win 7和IE 8,我没有找到我存储的PID, ,因此我不再有能力改变焦点窗口。