天天看點

WebBrowser控件應用:彈出新窗體和關閉視窗

<b>Open</b><b>新頁面要處理的:&lt;?xml:namespace prefix="o" ns="urn:schemas-microsoft-com:office:office"?&gt;</b>

<b></b>

1:&lt;&lt;a href=’xxxxx’ target=’_blank’&gt;&gt;; 

     2: onclick=’window.open’ ;

3:引用js檔案 ;

4:ClientScript.RegisterStartupScript();等。

5:還有要實作在打開的頁面裡能用window.opener對象

<b>Close</b><b>要處理的:</b>

1:onclick=’window.close ;

2:引用js檔案 ;

3:ClientScript.RegisterStartupScript()等。

經過在網上搜尋,結果并不令人滿意。基本上,WebBrowser控件不提供這個(将要打開的新頁面的位址)功能,隻能通過其他方法。

這裡介紹一下網上的一個簡單的解決方案、我的一個簡單方案、微軟的回答、一個終極解決方法。

<b>網上現在有人給出這樣的一個解決方案</b>:在_NewWindow事件通過wb_Container.StatusText來獲得目前将要打開的頁面。代碼可以這樣寫:

        private void wb_Container_NewWindow(object sender, CancelEventArgs e)

        {

            e.Cancel = true;

             string newURL = wb_Container.StatusText;

            //'open

        }

我測試了一下,這樣做基本上隻能處理&lt;a href=’xxxxx’ target=’_blank’&gt;的這種情況。對于&lt;button&gt;裡面的onlcick事件window.open()毫無作用。

原因很簡單,他隻是利用了WebBrower現實Status的特點來做,不全面,不安全。至于其他情況也是完全不能處理,比如js中使用window.Open,這個方案根本不能檢查。

<b>我的處理方法</b>:

剛開始,我使用了這樣的思路:針對所有可能出現的情況,找個各個不同方法來處理。

比如說,對于&lt;a herf=’’的這種情況,就用wb_Container.StatusText方法,但是要加入一個判斷。If(wb_Container.StatusText!=””)。對于window.open和RegisterStartupScript的,可以通過替換js來實作。

本來的window.open函數,在程式完成加載之後,我把這個函數修改成window.external.open,

然後,我把我的AppBrowser類裡面加入幾個public的Open函數來對應原來的js的open函數就可以了。

這是一個代碼實作。

private void wb_Container_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)

            //for windows.open

            if (wb_Container.DocumentText.IndexOf("window.open(") &gt; -1 || wb_Container.DocumentText.IndexOf("window.close()") &gt; -1)

            {

                wb_Container.DocumentText = wb_Container.DocumentText.Replace("window.open(", "window.external.open(").Replace("window.close()", "window.external.close()");

            }

這樣處理之後,保證了我的浏覽器也能了解這些js。

這個方案唯一不能處理的就是js檔案裡面有處理的情況。

還有一個小問題,替換之後的document對象的action變化了。這個可以通過方法來實作,就是替換上邊的函數,改用遞歸document.all來實作,檢查每個element控件的内容來實作。

但是,畢竟美中不足。

<b>微軟的解釋是這樣的</b>:這個問題,下一個版本在解決(http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115195),開發者可以通過擴充WebBrower及其Event來實作。并且提供了一個簡單的代碼(但是顯示不完全)。是的,這是個好的解決方案,但不是我想要的。既然封裝了這個控件,為什麼不提供這麼重要的一個參數呢?

(作者實作了一個類似IE7效果的浏覽器)

這個模型裡面,作者自己封裝并且擴充了這個控件,是個最終極的解決方法。

主要思路:提供了一個将要打開新視窗的事件,并且提供更多的參數。這些參數來自IWebBrowser2等接口,還提供了一些<code>WndProc</code>重載來實作window.close。

下載下傳之後,我保留了這些類,做了一個簡單的測試

ExtendedWebBrowser : System.Windows.Forms.WebBrowser

   .WebBrowserExtendedEvents : UnsafeNativeMethods.DWebBrowserEvents2

   .WindowsMessages(enum)

UnsafeNativeMethods

   .DWebBrowserEvents2([ComImport, TypeLibType((short)0x1010), InterfaceType((short)2), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D")])

   .IWebBrowser2([ComImport, SuppressUnmanagedCodeSecurity, TypeLibType(TypeLibTypeFlags.FOleAutomation | (TypeLibTypeFlags.FDual | TypeLibTypeFlags.FHidden)), Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E")])

BrowserExtendedNavigatingEventArgs : CancelEventArgs

UrlContext

ScriptError

NativeMethods

結果非常不錯。

主要處理的幾個地方:

<code>NewWindow2</code><code>和</code><code>NewWindow3</code>:處理新打開視窗

<code>BeforeNavigate2</code>:獲得将要打開的視窗的位址。

主要提供的新事件:_StartNewWindow(object sender, BrowserExtendedNavigatingEventArgs e)

下邊這一個是我的第二個AppBrowser類,使用上邊封裝擴充之後的WebBrower控件。

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

AppBrowser2 source code

  1

WebBrowser控件應用:彈出新窗體和關閉視窗

    [System.Runtime.InteropServices.ComVisibleAttribute(true)]

  2

WebBrowser控件應用:彈出新窗體和關閉視窗

    public partial class AppBrowser2 : Form

  3

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

{

  4

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

        property#region property

  5

WebBrowser控件應用:彈出新窗體和關閉視窗

        private string _url;

  6

WebBrowser控件應用:彈出新窗體和關閉視窗

        public string URL

  7

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

  8

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

            get 

WebBrowser控件應用:彈出新窗體和關閉視窗

{ return _url; }

  9

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

            set 

WebBrowser控件應用:彈出新窗體和關閉視窗

{ this._url = value; }

 10

WebBrowser控件應用:彈出新窗體和關閉視窗

        }

 11

WebBrowser控件應用:彈出新窗體和關閉視窗

 12

WebBrowser控件應用:彈出新窗體和關閉視窗

        private ExtendedWebBrowser _browser;

 13

WebBrowser控件應用:彈出新窗體和關閉視窗

        // Allows other code to obtain a reference to the extended web browser component

 14

WebBrowser控件應用:彈出新窗體和關閉視窗

        private ExtendedWebBrowser WebBrowser

 15

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 16

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

{ return _browser; }

 17

WebBrowser控件應用:彈出新窗體和關閉視窗

 18

WebBrowser控件應用:彈出新窗體和關閉視窗

        #endregion

 19

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

        cons.#region cons.

 20

WebBrowser控件應用:彈出新窗體和關閉視窗

        public AppBrowser2()

 21

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 22

WebBrowser控件應用:彈出新窗體和關閉視窗

            InitializeComponent();

 23

WebBrowser控件應用:彈出新窗體和關閉視窗

 24

WebBrowser控件應用:彈出新窗體和關閉視窗

        public AppBrowser2(string url)

 25

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 26

WebBrowser控件應用:彈出新窗體和關閉視窗

 27

WebBrowser控件應用:彈出新窗體和關閉視窗

            _browser = new ExtendedWebBrowser();

 28

WebBrowser控件應用:彈出新窗體和關閉視窗

            _browser.Dock = DockStyle.Fill;

 29

WebBrowser控件應用:彈出新窗體和關閉視窗

            _browser.DownloadComplete += new EventHandler(_browser_DownloadComplete);

 30

WebBrowser控件應用:彈出新窗體和關閉視窗

            _browser.Navigated += new WebBrowserNavigatedEventHandler(_browser_Navigated);

 31

WebBrowser控件應用:彈出新窗體和關閉視窗

            _browser.StartNewWindow += new EventHandler&lt;BrowserExtendedNavigatingEventArgs&gt;(_browser_StartNewWindow);//get js:window.open or &lt;a href event

 32

WebBrowser控件應用:彈出新窗體和關閉視窗

            _browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(_browser_DocumentCompleted);

 33

WebBrowser控件應用:彈出新窗體和關閉視窗

            _browser.StatusTextChanged += new EventHandler(_browser_StatusTextChanged);

 34

WebBrowser控件應用:彈出新窗體和關閉視窗

            _browser.Quit += new EventHandler(_browser_Quit);//get js:window.close event

 35

WebBrowser控件應用:彈出新窗體和關閉視窗

            this.pnl_container.Controls.Add(_browser);

 36

WebBrowser控件應用:彈出新窗體和關閉視窗

            this.URL = url;

 37

WebBrowser控件應用:彈出新窗體和關閉視窗

            _browser.Navigate(URL);

 38

WebBrowser控件應用:彈出新窗體和關閉視窗

            _browser.ObjectForScripting = this;//set this to be the COM handler

 39

WebBrowser控件應用:彈出新窗體和關閉視窗

        } 

 40

WebBrowser控件應用:彈出新窗體和關閉視窗

 41

WebBrowser控件應用:彈出新窗體和關閉視窗

 42

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

        window : close and open#region window : close and open

 43

WebBrowser控件應用:彈出新窗體和關閉視窗

        void _browser_Quit(object sender, EventArgs e)

 44

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 45

WebBrowser控件應用:彈出新窗體和關閉視窗

            this.Close();

 46

WebBrowser控件應用:彈出新窗體和關閉視窗

 47

WebBrowser控件應用:彈出新窗體和關閉視窗

 48

WebBrowser控件應用:彈出新窗體和關閉視窗

        void _browser_StartNewWindow(object sender, BrowserExtendedNavigatingEventArgs e)

 49

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 50

WebBrowser控件應用:彈出新窗體和關閉視窗

            AppBrowser2 ab2 = new AppBrowser2(e.Url.ToString());

 51

WebBrowser控件應用:彈出新窗體和關閉視窗

            e.AutomationObject = ab2.WebBrowser.Application;//for 'window.opener'  

 52

WebBrowser控件應用:彈出新窗體和關閉視窗

            ab2.Show();

 53

WebBrowser控件應用:彈出新窗體和關閉視窗

 54

WebBrowser控件應用:彈出新窗體和關閉視窗

 55

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

        other browser event#region other browser event

 56

WebBrowser控件應用:彈出新窗體和關閉視窗

        void Window_Error(object sender, HtmlElementErrorEventArgs e)

 57

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 58

WebBrowser控件應用:彈出新窗體和關閉視窗

            // We got a script error, record it

 59

WebBrowser控件應用:彈出新窗體和關閉視窗

            //ScriptErrorManager.Instance.RegisterScriptError(e.Url, e.Description, e.LineNumber);

 60

WebBrowser控件應用:彈出新窗體和關閉視窗

            // Let the browser know we handled this error.

 61

WebBrowser控件應用:彈出新窗體和關閉視窗

            e.Handled = true;

 62

WebBrowser控件應用:彈出新窗體和關閉視窗

 63

WebBrowser控件應用:彈出新窗體和關閉視窗

        void _browser_DownloadComplete(object sender, EventArgs e)

 64

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 65

WebBrowser控件應用:彈出新窗體和關閉視窗

            // Check wheter the document is available (it should be)

 66

WebBrowser控件應用:彈出新窗體和關閉視窗

            if (this.WebBrowser.Document != null)

 67

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 68

WebBrowser控件應用:彈出新窗體和關閉視窗

                // Subscribe to the Error event

 69

WebBrowser控件應用:彈出新窗體和關閉視窗

                this.WebBrowser.Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error);

 70

WebBrowser控件應用:彈出新窗體和關閉視窗

                UpdateAddressBox();

 71

WebBrowser控件應用:彈出新窗體和關閉視窗

            }

 72

WebBrowser控件應用:彈出新窗體和關閉視窗

 73

WebBrowser控件應用:彈出新窗體和關閉視窗

        void _browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)

 74

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 75

WebBrowser控件應用:彈出新窗體和關閉視窗

            UpdateAddressBox();

 76

WebBrowser控件應用:彈出新窗體和關閉視窗

 77

WebBrowser控件應用:彈出新窗體和關閉視窗

        void _browser_Navigated(object sender, WebBrowserNavigatedEventArgs e)

 78

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 79

WebBrowser控件應用:彈出新窗體和關閉視窗

 80

WebBrowser控件應用:彈出新窗體和關閉視窗

 81

WebBrowser控件應用:彈出新窗體和關閉視窗

 82

WebBrowser控件應用:彈出新窗體和關閉視窗

        void _browser_StatusTextChanged(object sender, EventArgs e)

 83

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 84

WebBrowser控件應用:彈出新窗體和關閉視窗

            this.toolStripStatusState.Text = WebBrowser.StatusText;

 85

WebBrowser控件應用:彈出新窗體和關閉視窗

 86

WebBrowser控件應用:彈出新窗體和關閉視窗

        // Updates the info on the window

 87

WebBrowser控件應用:彈出新窗體和關閉視窗

        private void UpdateAddressBox()

 88

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

 89

WebBrowser控件應用:彈出新窗體和關閉視窗

            this.toolStripStatusTitle.Text = this.WebBrowser.Document.Title;

 90

WebBrowser控件應用:彈出新窗體和關閉視窗

 91

WebBrowser控件應用:彈出新窗體和關閉視窗

 92

WebBrowser控件應用:彈出新窗體和關閉視窗

 93

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

        external function for js#region external function for js

 94

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

        /**//// &lt;summary&gt;

 95

WebBrowser控件應用:彈出新窗體和關閉視窗

        /// this function can be invoked by js in html

 96

WebBrowser控件應用:彈出新窗體和關閉視窗

        /// like this 'javascript:window.external.ShowMessage('this is invoke from web');'

 97

WebBrowser控件應用:彈出新窗體和關閉視窗

        /// &lt;/summary&gt;

 98

WebBrowser控件應用:彈出新窗體和關閉視窗

        /// &lt;param name="msg"&gt;&lt;/param&gt;

 99

WebBrowser控件應用:彈出新窗體和關閉視窗

        public void ShowMessage(string msg)

100

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

101

WebBrowser控件應用:彈出新窗體和關閉視窗

            MessageBox.Show(msg, "alert");

102

WebBrowser控件應用:彈出新窗體和關閉視窗

103

WebBrowser控件應用:彈出新窗體和關閉視窗

104

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

105

WebBrowser控件應用:彈出新窗體和關閉視窗

        /// open new, for JS: window.open

106

WebBrowser控件應用:彈出新窗體和關閉視窗

107

WebBrowser控件應用:彈出新窗體和關閉視窗

        /// &lt;param name="url"&gt;&lt;/param&gt;

108

WebBrowser控件應用:彈出新窗體和關閉視窗

        public void Open(string url)

109

WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗
WebBrowser控件應用:彈出新窗體和關閉視窗

110

WebBrowser控件應用:彈出新窗體和關閉視窗

            AppBrowser2 newAB2 = new AppBrowser2(url);

111

WebBrowser控件應用:彈出新窗體和關閉視窗

            newAB2.Show();

112

WebBrowser控件應用:彈出新窗體和關閉視窗

113

WebBrowser控件應用:彈出新窗體和關閉視窗

114

WebBrowser控件應用:彈出新窗體和關閉視窗

    }

繼續閱讀