注:本文適用.net 2.0+的winform項目
目的:
- 點擊頁面中的target="_blank"鏈接時,彈出新窗體
- 頁面中有window.close()操作時,關閉窗體
上述窗體是指WebBrowser所在的Form,基本上,上述目的就是讓該窗體表現得像個正常瀏覽器而已。
一、彈出新窗體
WebBrowser(下稱wb)自帶NewWindow事件,所以直接注冊該事件即可:
private void wb_NewWindow(object sender, CancelEventArgs e) { e.Cancel = true;//這句加不加在我的環境里沒區別,不加也不會導致打開外部瀏覽器 new FmWebBrowser(wb.StatusText).Show(); //FmWebBrowser即我的承載wb的窗體,本類構造函數接受一個url,Show之后會令wb訪問該url。另外,該事件進入時,wb的StatusText幾乎可以斷定就是所點鏈接的href,極端情況以后遇到再說 }
二、響應頁面中的window.close以關閉本窗體
由於wb沒有現成的Close之類的事件,所以這個要稍稍折騰一下,就是給它加上這個事件,核心要解決的問題,就是讓wb知道頁面執行了window.close(),解決了這個,剩下就是把這事通知出去而已。
- 讓wb知道頁面執行了window.close(),並引發特定事件
方法是網上抄的,原理是頁面執行window.close()時wb會收到一個特定的win32消息,於是可以重載wb的WndProc方法來處理這個消息,這就需要繼承wb寫一個子類,子類如下:
using System; using System.Security.Permissions; using System.Windows.Forms; namespace AhDung.WinForm.Controls { /// <summary> /// 增強型瀏覽器 /// </summary> public class WebBrowserEx : WebBrowser { /// <summary> /// 當WebBrowser關閉后 /// </summary> public event EventHandler WindowClosed; protected void OnWindowClosed(EventArgs e) { if (WindowClosed != null) { WindowClosed(this, e); } } [PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")] protected override void WndProc(ref Message m) { if (m.Msg == 0x210/*WM_PARENTNOTIFY*/) { int wp = m.WParam.ToInt32(); int X = wp & 0xFFFF; if (X == 0x2/*WM_DESTROY*/)//若收到該消息,引發WindowClosed事件 { OnWindowClosed(EventArgs.Empty); } } base.WndProc(ref m); } } }
- 剩下就簡單了,宿主窗體響應WebBrowserEx的WindowClosed事件,關閉自身就好。當然首先要把之前的WebBrowser換成上述WebBrowserEx,代碼段:
private WebBrowserEx wbex = new WebBrowserEx(); ... public FmMain() { wbex.WindowClosed += wbex_WindowClosed; ... } void wbex_WindowClosed(object sender, System.EventArgs e) { this.Close(); }
- 文畢 -