2017-03-04 40 views
0

我正在创建一个应用程序,当按下将在Chrome中打开一个新标签,该标签将导致执行另一个功能的特定页面(我使用线程,因为它需要时间来执行此页面上的功能)。然后关闭页面。我将如何能够这样做?C#应用程序打开页面和关闭页面与计时器

我会认为这段代码会起作用(google.com显然不是页面)。

var proc = Process.Start("chrome.exe", "google.com"); //open chrome tab. 
       Thread.Sleep(1000); //wait for the page to load and execute the function on the page 
       proc.Kill(); //remove tab 

但是,我得到的错误:

"An unhandled exception of type 'System.InvalidOperationException' occurred in System.dll

Additional information: Cannot process request because the process has exited."

而且,标签不会关闭。

+0

尝试执行此操作时,chrome是否已在运行? –

+0

是的。我想在新标签中运行。如果用户没有打开chrome,它会打开铬然后为他们做。 –

+0

好的,请看我的答案,并让我知道,如果这可能是你在找什么。我收录了一些意见以供进一步解释 –

回答

0

既然你已经说过可能已经或可能不会有一个Chrome运行的实例,这可能会得到你正在寻找的结果:

// Open chrome tab. 
var proc = Process.Start("chrome.exe", "google.com"); 

// Wait for the page to load and execute the function on the page. 
Thread.Sleep(1000); 

// Check for valid running new instance of Chrome. 
if (!proc.HasExited) 
{ 
    // Kill new Chrome proc. 
    proc.Kill(); 
} 
else 
{ 
    // Find already running proc of Chrome. 
    var alreadyRunningProc = Process.GetProcessesByName("chrome.exe"); 

    foreach (var chrome in alreadyRunningProc) 
    { 
     // Kill any already running Chrome procs. 
     chrome.Kill(); 
    } 
} 
+0

同样的错误。可悲的是。 –

+0

刚刚发现我的错误。请再试一次。我需要更改if语句来检查它是否已经退出,而不仅仅是一个空对象。 –

+0

没有错误。但不关闭标签大声笑! –

0

执行chrome.exe时,chrome本身会检查另一个chrome实例是否已在运行(当您只需要添加新选项卡时就是这种情况)。因此,新执行的chrome.exe只是向正在运行的chrome.exe发送一堆信息,用户试图访问cmdline-args给出的页面。之后,您新执行的chrome.exe终止。

已经运行的chrome.exe现在为新选项卡创建了一个新的子进程,与刚通知用户交互(即:您的chrome.exe实例)的进程完全不同。

一个可能的,虽然不是完全没有错误的方法是扫描打开的进程列表,并在您的调用完成后扫描新的chrome.exe进程。

但即使杀死该进程也不会关闭该选项卡。正如您在chrome早期可能已经注意到的那样,当网站进程崩溃时,用户会收到关于该问题的通知,并且页面被重新加载(新流程开始)。

我想你将不得不编写一个用于远程控制的chrome扩展,或者可能有一个现有的chrome api来实现你想要做的事情。

0

我认为这是因为Process.Start返回'null'而不是进程,因为chrome已经在运行。

proc.kill()中的null抛出异常。

试着看一下这个问题,它做了一件similar- Open a Chrome Tab and Close it

0

可以使用的Visual Studio C#“定时器”的工具,它会做你的工作只是
看看这个代码:

private void Form1_Load(object sender, EventArgs e) 
     { 
      timer1.Interval = 100; 
     } 


int timerCounter=0; 
     private void timer1_Tick(object sender, EventArgs e) 
     { 
      timerCounter += 100; 

      if (timerCounter == 100) 
      { 
       var proc = Process.Start("chrome.exe", "google.com"); //open chrome tab. 
      } 

      if (timerCounter == 5000) //5000 = 5 minutes , like waiting time for 5 mins to execute the function on this page . 
      { 
       proc.Kill(); //remove tab 
       timerCounter = 0; 
       timer1.Stop(); 
      } 

     } 

private void button2_Click(object sender, EventArgs e) 
     { 
      timer1.Start(); 
     } 
+0

它不会允许您在该位置使用var proc。因此你不能使用“Proc.KillI();” –

+0

是的你没错,var proc; if(timerCounter == 100) {proc = Process.Start(“chrome.exe”,“google.com”); //打开chrome选项卡。 } –

+0

如果不定义它,就不能使用var ... –

相关问题