2012-07-05 79 views
2

我有一個使用Process.Start方法啓動Internet Explorer(版本9,在Win7 X64上)的WPF應用程序。如何在使用Process.Start運行時關閉Internet Explorer?

我保存ProcessID以便在應用程序關閉時關閉它。但是,當應用程序退出時,Internet Explorer仍在任務管理器中可見。

這裏是我使用的代碼:

public class MyClass : IDisposable 
{ 
    Process _process; 


    public void Go() 
    { 

     ProcessStartInfo psi = new ProcessStartInfo { 
      FileName = "iexplore.exe", 
      Arguments = "-noframemerging -private \"http://whathaveyoutried.com\"" 
     }; 
     _process = Process.Start(psi); 
     _process.WaitForInputIdle(); 
    } 

    private void Close(object sender, RoutedEventArgs e) 
    { 
     if (_process != null) 
     { 
      _process.Refresh(); 
      _process.Close(); 
     } 
    } 

    public void Dispose() 
    { 
     if (_process != null) 
     { 
      _process.Refresh(); 
      _process.Close(); 
     } 
    } 
} 

}

我仔細檢查了,調用_process.Close()實際完成的。

什麼會導致此行爲?

PS:我懷疑這是由於Internet Explorer的內部。運行這個exe不需要創建一個新的進程,但可以使用一些IPC來控制其他實例。我使用-noframemerging命令行參數,但它並不希望解決問題。

[編輯]這是另一個question I asked few days ago的延續。其實,我是Pinvoking SetParent函數來在我的應用程序中嵌入生成的IE。我無法使用WebBrowser控件,因爲它不支持我正在尋找的隔離。因此,當我的應用程序關閉時關閉IE即可。

+0

如果啓動一個可見的應用程序,它屬於用戶,而不是您的應用程序(例如,他們可能會在那裏打開新的標籤頁)。如果您想要受限制的瀏覽器,請在屬於您的應用的窗口中使用某種瀏覽器控件。 – 2012-07-05 14:43:55

+0

這個需求[背後有一點背景](http://stackoverflow.com/questions/11186817)。基本上,我不能使用WebBrowser控件,所以我啓動一個新的IE並使用SetParent在我的應用程序中附加它的窗口。這工作,有點醜陋,但工作。唯一的缺點是我不知道如何實際跟蹤實際的過程,並導致內存中的虛影過程。但你是對的。在一個'標準'的情況下,這將是一個不好的做法:) – 2012-07-05 14:48:45

+3

正如我所說 - 另一個缺點是,用戶開始對待該IE實例像任何其他(他們可能無法區分),並打開新標籤頁,指着與你無關的網頁。用戶*不會期望退出應用程序將會終止其IE窗口之一。 – 2012-07-05 14:50:18

回答

0

Internet Explorer的每個選項卡都是一個進程。如果您使用多個選項卡打開IE,或者用戶打開了另一個選項卡,則它不足以終止進程。

_process.Close(); 

釋放所有資源屬於_process。您可以使用_process.Kill()方法代替它。

+0

這實際上會殺死Internet Explore的實例。我對這種技術有點不舒服,因爲我不確定殺死一個進程,而不是讓它正常關機,不會有副作用。 – 2012-07-05 15:06:20

+0

_Process.Close()eventuall調用_Process.Kill(),所以我沒有看到區別。你甚至嘗試過,看看它是否可行,我的意思是你已經在「我正在使用黑客」來做你想做的事。 – 2012-07-05 15:30:33

0

爲了獲得更好的安全性和穩定性,IE8使用鬆散耦合的Internet Explorer(LCIE)體系結構並在不同的進程中運行瀏覽器框架和選項卡。 LCIE可以防止毛刺和掛起消除整個瀏覽器,並提高性能和可擴展性。我在Wikipedia上讀到這個。你可以disable LCIE,但我不知道你爲什麼想要這樣做。我會考慮使用@Damien_The_Unbeliever上面提到的解決方案。

+0

我不會禁用LCIE或任何可以改變用戶配置的東西。正如我對@damien_the_unbeliever所說的,我無法使用Web瀏覽器控件來解決更復雜的問題。僅供參考,我使用-noframemerging來確保IE在新流程中啓動(實際上是新會話)。也許有辦法要求這個特定的IE實例關閉它的所有選項卡? – 2012-07-05 15:00:38

+0

現在你知道進程ID爲什麼不一樣了,你應該問一個新問題。我如何在IE9中獲取/查找特定選項卡的進程ID? – 2012-07-05 15:15:44

+0

我改寫了這個問題 – 2012-07-05 15:24:36

0

我在我的Win32應用程序的IE應用程序,我使用Win32Api - SendMessage with WM_CLOSE = 0x0010

SendMessage(handle,0x0010,IntPtr.Zero, IntPtr.Zero)} 

這將關閉IE瀏覽器,無論你有多需要有瀏覽器(類IEFrame)的具體處理。

有一個缺點,如果您有多個選項卡,IE會打開確認關閉對話框,防止關閉過程。

克服對話框打開的一種方法是將其複選框設置爲(總是關閉),但對我來說它不是一個選項。

相關問題