C#中的webBrowser空間 串連InvokeMember("click") 無效問題

來源:互聯網
上載者:User

標籤:

首先要確定擷取到了連線物件的前提下

 

由於設定了取消新視窗開啟

private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
{
e.Cancel=true;
}

 

因此在webbrowser 中的 彈出新視窗的串連都被屏蔽了 顯示無效

方法一、

 //將所有的連結的目標,指向本表單    foreach (HtmlElement archor in this.webBrowser1.Document.Links)    {        archor.SetAttribute("target", "_self");    }    //將所有的FORM的提交目標,指向本表單    foreach (HtmlElement form in this.webBrowser1.Document.Forms)    {        form.SetAttribute("target", "_self");    }

  


將 WebBrowser 的 AllowWebBrowserDrop 設為 false
將 WebBrowser 的 WebBrowserShortcutsEnabled 設為 false
將 WebBrowser 的 IsWebBrowserContextMenuEnabled 設為 false


方法二

在NewWindow事件中取得要開啟的網址,取消開啟新視窗,然後在本視窗開啟要轉向的網址
private void webBrowser_1_NewWindow(object sender, CancelEventArgs e) { WebBrowser webBrowser_temp = (WebBrowser)sender;string newUrl = webBrowser_temp.Document.ActiveElement.GetAttribute("href"); webBrowser_1.Url = new Uri(newUrl); e.Cancel = true; }

  

 

雖然這種方法能夠解決大部分的要求,但是治標不治本。
而且當網址裡面還有漢字的時候就更加麻煩了,比如在百度MP3,歌曲名字都是漢字,和百度空間裡面,大部分使用者名稱都是漢字,所以取的網址都用亂碼。雖然,可以對網址進行編碼,但是並不是所有網頁都是uft-8編碼,對於如何得知網頁的編碼又是一個課題了。

 

方法三

 

最根本的方法就是重寫了。
建立一個類

 

 

using System;using System.Collections.Generic;using System.Text;namespace webTestRecorder{    public class ExtendedWebBrowser : System.Windows.Forms.WebBrowser    {        System.Windows.Forms.AxHost.ConnectionPointCookie cookie;        WebBrowserExtendedEvents events;        //This method will be called to give you a chance to create your own event sink        protected override void CreateSink()        {            //MAKE SURE TO CALL THE BASE or the normal events won‘t fire            base.CreateSink();            events = new WebBrowserExtendedEvents(this);            cookie = new System.Windows.Forms.AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(DWebBrowserEvents2));        }        protected override void DetachSink()        {            if (null != cookie)            {                cookie.Disconnect();                cookie = null;            }            base.DetachSink();        }        //This new event will fire when the page is navigating        public event EventHandler<WebBrowserExtendedNavigatingEventArgs> BeforeNavigate;        public event EventHandler<WebBrowserExtendedNavigatingEventArgs> BeforeNewWindow;        protected void OnBeforeNewWindow(string url, out bool cancel)        {            EventHandler<WebBrowserExtendedNavigatingEventArgs> h = BeforeNewWindow;            WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, null);            if (null != h)            {                h(this, args);            }            cancel = args.Cancel;        }        protected void OnBeforeNavigate(string url, string frame, out bool cancel)        {            EventHandler<WebBrowserExtendedNavigatingEventArgs> h = BeforeNavigate;            WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, frame);            if (null != h)            {                h(this, args);            }            //Pass the cancellation chosen back out to the events            cancel = args.Cancel;        }        //This class will capture events from the WebBrowser        class WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, DWebBrowserEvents2        {            ExtendedWebBrowser _Browser;            public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; }            //Implement whichever events you wish            public void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel)            {                _Browser.OnBeforeNavigate((string)URL, (string)targetFrameName, out cancel);            }            public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL)            {                _Browser.OnBeforeNewWindow((string)URL, out cancel);            }        }        [System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),        System.Runtime.InteropServices.InterfaceTypeAttribute(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIDispatch),        System.Runtime.InteropServices.TypeLibType(System.Runtime.InteropServices.TypeLibTypeFlags.FHidden)]        public interface DWebBrowserEvents2        {            [System.Runtime.InteropServices.DispId(250)]            void BeforeNavigate2(                [System.Runtime.InteropServices.In,                System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp,                [System.Runtime.InteropServices.In] ref object URL,                [System.Runtime.InteropServices.In] ref object flags,                [System.Runtime.InteropServices.In] ref object targetFrameName, [System.Runtime.InteropServices.In] ref object postData,                [System.Runtime.InteropServices.In] ref object headers,                [System.Runtime.InteropServices.In,                System.Runtime.InteropServices.Out] ref bool cancel);            [System.Runtime.InteropServices.DispId(273)]            void NewWindow3(                [System.Runtime.InteropServices.In,                System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp,                [System.Runtime.InteropServices.In, System.Runtime.InteropServices.Out] ref bool cancel,                [System.Runtime.InteropServices.In] ref object flags,                [System.Runtime.InteropServices.In] ref object URLContext,                [System.Runtime.InteropServices.In] ref object URL);        }    }    public class WebBrowserExtendedNavigatingEventArgs : System.ComponentModel.CancelEventArgs    {        p rivate string _Url;        public string Url        {            get { return _Url; }        }        p rivate string _Frame;        public string Frame        {            get { return _Frame; }        }        public WebBrowserExtendedNavigatingEventArgs(string url, string frame)            : base()        {            _Url = url;            _Frame = frame;        }    }}

 

 

然後把webBrowser換成我們重寫的ExtendedWebBrowser,添加事件處理


 ieBrowser = new ExtendedWebBrowser();ieBrowser.BeforeNewWindow += new EventHandler<WebBrowserExtendedNavigatingEventArgs>(ieBrowser_BeforeNewWindow);

然後在其BeforeNewWindow事件中:

void ieBrowser_BeforeNewWindow(object sender, WebBrowserExtendedNavigatingEventArgs e) {     e.Cancel=true;     ((ExtendedWebBrowser)sender).Navigate(e.Url);}

 

  

 

 

 


C#中的webBrowser空間 串連InvokeMember("click") 無效問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.