我有一個使用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即可。
如果啓動一個可見的應用程序,它屬於用戶,而不是您的應用程序(例如,他們可能會在那裏打開新的標籤頁)。如果您想要受限制的瀏覽器,請在屬於您的應用的窗口中使用某種瀏覽器控件。 – 2012-07-05 14:43:55
這個需求[背後有一點背景](http://stackoverflow.com/questions/11186817)。基本上,我不能使用WebBrowser控件,所以我啓動一個新的IE並使用SetParent在我的應用程序中附加它的窗口。這工作,有點醜陋,但工作。唯一的缺點是我不知道如何實際跟蹤實際的過程,並導致內存中的虛影過程。但你是對的。在一個'標準'的情況下,這將是一個不好的做法:) – 2012-07-05 14:48:45
正如我所說 - 另一個缺點是,用戶開始對待該IE實例像任何其他(他們可能無法區分),並打開新標籤頁,指着與你無關的網頁。用戶*不會期望退出應用程序將會終止其IE窗口之一。 – 2012-07-05 14:50:18