當IE瀏覽器遇到指令碼錯誤時瀏覽器,左下角會出現一個黃色表徵圖,點擊可以查看指令碼錯誤的詳細資料,並不會有彈出的錯誤資訊框。當我們使用WebBrowser控制項時有錯誤資訊框彈出,這樣程式顯的很不友好,而且會讓一些自動執行的程式暫停。我看到有人採取的解決方案是做一個表單殺手程式來關閉彈出的表單。今天探討的方法是從控制項解決問題。
1、SHDocVw.dll
在COM時代我們使用的WebBrowser控制項是SHDocVw.dll。屏蔽錯誤資訊的方法很簡單使用下面的一句就可以搞定。
WebBrowser1.Silent = true
2、.Net中
在.Net中提供了託管的WebBrowser可供我們使用,當然我們仍然可以在.Net中使用COM組建SHDocVw.dll,如果使用SHDocVw.dll
處理錯誤方式和上面的方法一樣。但如果我們是使用.Net組件如何解決這個問題呢?
這個組件給我們提供了一個方法ScriptErrorsSuppressed 。但是在.net framework2.0中他是不起作用的,據說在低版本中使用如下的方式解決
webBrowser1.ScriptErrorsSuppressed = true(據說在.net framework2.0以前是這樣,我沒有使用過)
那麼在.net framework2.0中如何解決這個問題呢?
有一種方法不能徹底解決,可以部分解決問題這裡也介紹給大家。
//捕獲控制項的錯誤
this.WebBrowser.Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error);
//對錯誤進行處理
void Window_Error(object sender, HtmlElementErrorEventArgs e)
{
// 自己的處理代碼
e.Handled = true;
}
上面的方法對於多個架構嵌套等等的情形還是不能很好的解決。
為了徹底解決這個問題,我們藉助AxWebBrowser來解決WebBrowser的問題。
我們定義一個自己的類,他的父類是WebBrowser,以後使用這個類就可以了。在這個類的定義中需要引用SHDocVw。
class EWebBrowser : System.Windows.Forms.WebBrowser
{
SHDocVw.IWebBrowser2 Iwb2;
protected override void AttachInterfaces(object nativeActiveXObject)
{
Iwb2 = (SHDocVw.IWebBrowser2)nativeActiveXObject;
Iwb2.Silent = true;
base.AttachInterfaces(nativeActiveXObject);
}
protected override void DetachInterfaces()
{
Iwb2 = null;
base.DetachInterfaces();
}
}
從上面的代碼可以看出EWebBrowser截取了AxWebBrowser介面,並利用了AxWebBrowser的屬性Silent來實現。