博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中的webBrowser空间 连接InvokeMember("click") 无效问题
阅读量:7062 次
发布时间:2019-06-28

本文共 6569 字,大约阅读时间需要 21 分钟。

首先要确定获取到了连接对象的前提下

 

由于设置了取消新窗口打开

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
BeforeNavigate; public event EventHandler
BeforeNewWindow; protected void OnBeforeNewWindow(string url, out bool cancel) { EventHandler
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
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
(ieBrowser_BeforeNewWindow);
 

然后在其BeforeNewWindow事件中:

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

 

  

 

 

 
 

转载于:https://www.cnblogs.com/wolly88/p/4273994.html

你可能感兴趣的文章
【Ansible】 Playbook 中的变量和引用
查看>>
仓库常需要对货品和数据记录
查看>>
使用c++实现乘法表输出
查看>>
100个常用的linux命令
查看>>
我的友情链接
查看>>
每天laravel-20160817| Container -20
查看>>
通用权限管理框架
查看>>
我的友情链接
查看>>
申请SSL证书怎样验证域名所有权
查看>>
Java开发在线打开编辑保存Word文件
查看>>
将学习进行到底!为普通人的奋斗送福
查看>>
常用十大python机器学习库
查看>>
TCP/IP三次握手四次挥手
查看>>
Systemstate Dump分析经典案例(下)
查看>>
PHPcms怎么调用二级栏目
查看>>
中小型网络构建案例——防火墙的应用
查看>>
《Linux就该这么学》 第3章 管道符、重定向与环境变量
查看>>
Okhttp3使用
查看>>
交换的江湖
查看>>
ubuntu16.04 双网卡绑定
查看>>