2017-03-04 73 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 ... –

相關問題