c#: WebBrowser 禁止在新窗口打开链接
项目中碰到此需求。几番比对,此为最好的解决方案,聊做备忘。
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 禁止在新窗口打开链接的更多相关文章
- 如何用CSS实现在新窗口打开链接?
*如何用CSS实现在新窗口打开链接? <style type="text/css"> <!-- .target2 a:active {test:expressio ...
- javascript新窗口打开链接window.open()被阻拦的解决办法
场景是ajax提交,比较后端效验数据,需要用户登录,提示后并需要新窗口打开登录的链接,使用window.open(url);往往会被浏览器认为是广告而被拦截. data.url是ajax返回的链接地址 ...
- 让你的wordpress在新窗口打开链接
在使用wordpress过程中笔者发现还有一些不太完善的地方,没有充分考虑到用户体验.所以,在使用wordpress建博之初,我们有必要对wordpress进行一次小改造,让wordpress更个性. ...
- jquery新窗口打开链接
第一种:下面的代码是针对m35ui这个样式下的a都是在新窗口打开 <script type="text/javascript"> jQuery(document ...
- router-link 返回上页 和 新窗口打开链接
1.如果使用了Vue-router的话,就可以用 this.$router.go(-1) 实现返回: 2.如果没使用vue-router,就可以用 window.history.go(-1) 实现返回 ...
- 更喜欢从一而终?bing测试在新窗口打开链接遭美国网友痛批
原链接地址:http://www.cnbeta.com/articles/186529.htm 我们都知道在中国网站点击一个链接之后,默认在新窗口或新标签打开,大家也很熟悉 ...
- 【模态窗口-Modeldialog】提交请求时禁止在新窗口打开页面的处理方法
在使用Window.ShowModalDialog()打开模态窗口后,在模态窗口内提交时总是会在新窗口中打开. 解决办法: 在要弹出的窗口的<head>之间加: <base targ ...
- webBrowser强制在本窗口打开,禁止在新窗口打开
有时需要用WebBrowser加载URL,来实现某些功能.而这时,我们就不希望所打开的页面中的链接,在新窗口中打开,因为这样的话,实际上是用系统默认的浏览器打开了,从而脱离了你的WebBrowser, ...
- selenium实现在新窗口打开链接
问题:页面代码中不存在target="_blank",怎么实现点击一个按钮,在新窗口中打开? WebElement link = element.findElement(By.ta ...
随机推荐
- android全屏/沉浸式状态栏下,各种键盘挡住输入框解决办法
https://blog.csdn.net/smileiam/article/details/69055963
- JSON 序列化与反序列化, 与XML相互转换.
方式一: 使用于 JavaScriptSerializer类 适用于普通场景, Excel导入导出, 前台传输查询参数直接处理等. JavaScriptSerializer serializer = ...
- logging模块全总结
Python之日志处理(logging模块) 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四 ...
- 01-JDK环境配置
环境说明: Window server 2008 64位 jdk-7u80-windows-x64 apache-tomcat-7.0.57-windows-x64 1.安装JDK环境配置 JAVA_ ...
- 关于破解visualsvn 我这里是版本是5.2.1
1.首先备份当前安装visualSVN文件的bin目录,万一出错还能反个水.一般默认安装路径是C:\Program Files (x86)\VisualSVN\bin 2.然后运行ildasm,Win ...
- VS2017 ASP.NET MVC 5.0 开部署问题汇总
1[SqlException (0x80131904): 拒绝了对对象 '****' (数据库 '***',架构 'dbo')的 EXECUTE 权限.] “/”应用程序中的服务器错误. SQL 20 ...
- sprinmvc与 Struct2框架的区别
1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...
- aptitude与apt-get的区别和联系
aptitude 与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具.与 apt-get 不同的是,aptitude 在处理依赖问题上更佳一些.举例来说,aptitud ...
- foreach控制循环if判断
<c:forEach items="${resultMap}" var="daily" varStatus="n"> <t ...
- react-native shadow失效
做边框阴影,但是有时候会失效,内容产生阴影,而边框无效,今天发现了原因,没错,就是没有设置背景颜色导致的.如图