项目中碰到此需求。几番比对,此为最好的解决方案,聊做备忘。

1、加入Microsoft Internet Controls引用:

项目右键->添加引用->COM->Microsoft Internet Controls,加入后,其引用名为SHDocVw。

2、扩展WebBrowser控件:

    public class WebBrowser : System.Windows.Forms.WebBrowser
{
public delegate void NewWindow3EventHandler(ref bool Cancel, string bstrUrl);
//发布NewWindow3事件
public event NewWindow3EventHandler NewWindow3; protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e); if (this.ActiveXInstance != null)
{
var browser = this.ActiveXInstance as SHDocVw.WebBrowser;
browser.NewWindow3 += WebBrowser_NewWindow3;
}
} private void WebBrowser_NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl)
{
var handler = NewWindow3;
if (handler != null)
handler(ref Cancel, bstrUrl);
}
}

3、使用:

代替原生WebBrowser,处理NewWindow3事件:

        private void browser_NewWindow3(ref bool Cancel, string bstrUrl)
{
Cancel = true;
browser.Navigate(bstrUrl);
}

完美实现!

其它方案,都不好用,比如:

    private void browser_NewWindow(object sender, CancelEventArgs e)
{
//打开新窗口的方式是在已有的窗口内打开...可能为空
webBrowser.Url = new Uri(((WebBrowser)sender).StatusText);
e.Cancel = true;
}
    private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//将所有的链接的目标,指向本窗体...实测,没啥用
foreach (HtmlElement archor in this.webBrowser.Document.Links)
{
archor.SetAttribute("target", "_self");
}
//将所有的FORM的提交目标,指向本窗体
foreach (HtmlElement form in this.webBrowser.Document.Forms)
{
form.SetAttribute("target", "_self");
}
}
    private void wB_MainBrowser_NewWindow(object sender, CancelEventArgs e)
{
e.Cancel = true;
try
{
//有javascript: {0}这样的东西
string url = this.wB_MainBrowser.Document.ActiveElement.GetAttribute("href");
this.wB_MainBrowser.Url = new Uri(url);
}
catch
{
}
}

参考资料:

c# - NewWindow3 Event Not Fired - Stack Overflow

.net - Open link in same window with WebBrowser control - Stack Overflow

c#: WebBrowser 禁止在新窗口打开链接的更多相关文章

  1. 如何用CSS实现在新窗口打开链接?

    *如何用CSS实现在新窗口打开链接? <style type="text/css"> <!-- .target2 a:active {test:expressio ...

  2. javascript新窗口打开链接window.open()被阻拦的解决办法

    场景是ajax提交,比较后端效验数据,需要用户登录,提示后并需要新窗口打开登录的链接,使用window.open(url);往往会被浏览器认为是广告而被拦截. data.url是ajax返回的链接地址 ...

  3. 让你的wordpress在新窗口打开链接

    在使用wordpress过程中笔者发现还有一些不太完善的地方,没有充分考虑到用户体验.所以,在使用wordpress建博之初,我们有必要对wordpress进行一次小改造,让wordpress更个性. ...

  4. jquery新窗口打开链接

    第一种:下面的代码是针对m35ui这个样式下的a都是在新窗口打开    <script type="text/javascript">  jQuery(document ...

  5. router-link 返回上页 和 新窗口打开链接

    1.如果使用了Vue-router的话,就可以用 this.$router.go(-1) 实现返回: 2.如果没使用vue-router,就可以用 window.history.go(-1) 实现返回 ...

  6. 更喜欢从一而终?bing测试在新窗口打开链接遭美国网友痛批

                  原链接地址:http://www.cnbeta.com/articles/186529.htm 我们都知道在中国网站点击一个链接之后,默认在新窗口或新标签打开,大家也很熟悉 ...

  7. 【模态窗口-Modeldialog】提交请求时禁止在新窗口打开页面的处理方法

    在使用Window.ShowModalDialog()打开模态窗口后,在模态窗口内提交时总是会在新窗口中打开. 解决办法: 在要弹出的窗口的<head>之间加: <base targ ...

  8. webBrowser强制在本窗口打开,禁止在新窗口打开

    有时需要用WebBrowser加载URL,来实现某些功能.而这时,我们就不希望所打开的页面中的链接,在新窗口中打开,因为这样的话,实际上是用系统默认的浏览器打开了,从而脱离了你的WebBrowser, ...

  9. selenium实现在新窗口打开链接

    问题:页面代码中不存在target="_blank",怎么实现点击一个按钮,在新窗口中打开? WebElement link = element.findElement(By.ta ...

随机推荐

  1. UIView和CALayer区别

    (1)首先UIView可以响应用户的触摸事件,Layer不可以. (2)View中frame getter方法,bounds和center,UIView并没有做什么工作:它只是简单的各自调用它底层的C ...

  2. [UE4]显示落地箭头

    一.Set Hidden in Game:隐藏对象 Propagate to Children:是否修改容器子对象的可见性. 二.添加2个Static Mesh,分别命名为:StaitcMeshArr ...

  3. mysql 下的update select from的两种方式比较

    工作中遇到需要将一个表中的数据按照对应规则填入别的表中的情况 例如 表1 a a1    a2 11     90889 32     31241 12     52123 表2 b b1     b ...

  4. Windows10最新更新破坏了PowerShell功能

    Java9%E6%8E%A5%E8%BF%91%E4%BA%A4%E4%BB%98%E6%97%A5%E6%9C%9F%E5%92%8C%E8%8C%83%E5%9B%B4%E5%AE%A1%E6%9 ...

  5. java 英文单词拼写纠正框架(Word Checker)

    Word Checker 本项目用于单词拼写检查. 项目简介 word checker 用于单词拼写检查. Github 地址 特性说明 支持 i18n 错误提示支持 i18N 支持英文的单词纠错 可 ...

  6. servlet对象的生命周期

    servlet对象默认第一次访问的时候创建,服务器关闭的时候销毁.当servlet对象创建的时候会调用init方法,当对象销毁的时候,会调用destroy方法,每次访问servlet时,都会调用ser ...

  7. asp.net 微信开发(一)

    在准备工作中,我们已经完成准备工作,接下来就是进行开发啦,应该怎么来开发呢??容我想想...我觉得我们可以直接让用户的消息发送到微信的消息,转到我们自己的服务器上面!!感觉好厉害的样子 1.首先写 验 ...

  8. 初次接触Linux

    最近由于工作需求,需要接触Linux系统. 使用VMware虚拟机,安装ubuntu系统.网上教程很多. 配置opencv环境.这是我参考的网上帖子https://blog.csdn.net/fish ...

  9. SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介、创建消息生产者、创建消息消费者、自定义消息通道、分组与持久化、设置 RoutingKey)

    1.概念:SpringCloudStream 2.具体内容 2.1.SpringCloudStream 简介 SpringCloudStream 就是使用了基于消息系统的微服务处理架构.对于消息系统而 ...

  10. jsfl 进入影片 退出影片

    targetMC=fl.getDocumentDOM().getTimeline().layers [0].frames[0].elements[0]; fl.getDocumentDOM().lib ...