【手記】WebBrowser響應頁面中的blank開新窗口及window.close關閉本窗體


注:本文適用.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(),解決了這個,剩下就是把這事通知出去而已。

  1. 讓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);
            }
        }
    }
  2. 剩下就簡單了,宿主窗體響應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();
    }

- 文畢 -


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM