2015-06-16 14 views
1

我嘗試打開臨時HTML文件的默認瀏覽器,並刪除該文件,然後:如何使用默認瀏覽器打開HTML文件,並在用戶查看後刪除它?

 var tempFileName = Path.ChangeExtension(Path.GetTempFileName(), "html"); 
     // I save document to temp file here... 

     Process process = null; 
     try 
     { 
      process = Process.Start(tempFileName); 
     } 
     catch (Win32Exception) 
     { 
     } 
     catch (ObjectDisposedException) 
     { 
     } 
     catch (FileNotFoundException) 
     { 
     } 

     var worker = new BackgroundWorker(); 
     worker.DoWork += (s, we) => { 
      if (process != null) 
      { 
       process.WaitForExit(); 
       try 
       { 
        File.Delete(tempFileName); 
       } 
       catch (IOException) 
       { 
       } 
      } 
     }; 
     worker.RunWorkerAsync(); 

不幸的是,Process.Start,則返回null一個進程沒有啓動,但運行一個被使用(新標籤在谷歌開通鉻)。所以我不能等待這個過程退出。

所以,一個普遍的問題是:如何完成這項任務?如何向用戶顯示臨時HTML文件並在查看後將其刪除?

+1

等待幾秒鐘然後刪除文件? (瀏覽器不應該鎖定它)雖然這會阻止刷新 –

+0

詹姆斯邦德的東西在這裏...... – Botonomous

+0

這將防止刷新。用戶可能會發現這個文件丟失在一個奇怪的磁盤上。 –

回答

0

您可以強制新的瀏覽器實例,首先搞清楚的默認瀏覽器,並手動執行它:

public Process launchBrowser(string url) 
{ 
    string browserName = "iexplore.exe"; 
    using (RegistryKey userChoiceKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice")) 
    { 
     if (userChoiceKey != null) 
     { 
      object progIdValue = userChoiceKey.GetValue("Progid"); 
      if (progIdValue != null) 
      { 
       if(progIdValue.ToString().ToLower().Contains("chrome")) 
        browserName = "chrome.exe"; 
       else if(progIdValue.ToString().ToLower().Contains("firefox")) 
        browserName = "firefox.exe"; 
       else if (progIdValue.ToString().ToLower().Contains("safari")) 
        browserName = "safari.exe"; 
       else if (progIdValue.ToString().ToLower().Contains("opera")) 
        browserName = "opera.exe"; 
      } 
     } 
    } 

    return Process.Start(new ProcessStartInfo(browserName, url)); 
} 

然後你就可以得到一個處理過程:

var process = launchBrowser("www.google.com"); 

process.WaitForExit(); 

try 
{ 
    //Do whatever 
} 
catch (IOException) 
{ 
} 
+1

這是可能的,但有點複雜和不安全 –

+0

'WaitForExit()'不等待Chrome退出... –

+1

我認爲這個想法是複雜和不安全的! –

1

如果您使用ProcessStartInfo並設置UseShellExecute,那麼您可以通過直接「運行」HTML來啓動用戶的默認瀏覽器,就像您現在要做的那樣。我還沒有嘗試過,但它應該會給你一個Process以確定用戶何時關閉瀏覽器。

我仍然會準備一堆無法控制的邊緣案例。例如,如果他們打開瀏覽器,但關閉正在瀏覽器的應用程序。那時你是否讓瀏覽器保持活着?你殺了它嗎?你什麼時候刪除HTML文件?使用Web Browser控件可能會更好。那麼你甚至不必擔心其他進程或瀏覽器兼容性。您甚至可以將HTML內容流式傳輸到控件,並且以後沒有要刪除的文件。

+0

使用'ShellExecute'屬性沒有幫助:當我將它設置爲'false'時,該文件根本沒有打開。至於'WebBrowser',我不太喜歡這個解決方案:它依賴於IE,據我所知,在WebBrowser中使用瀏覽器帶來的所有功能並不容易:工具欄,選項卡等等。但是你是對的,用戶可能會關閉程序並保留瀏覽器。那麼實際上沒有什麼可做的。還有一種可能的解決方案是刪除應用程序退出時的文件... –

+1

它不應該是錯誤的。你確實需要使用shell,所以它必須是真實的。但是這聽起來像你會回到現在的船(Process.Start返回null) –

+0

是的,它是如此。返回的'Process'爲空。 –

相關問題