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 ...
随机推荐
- 02-Tomcat服务器安装
由于使用的是解压绿色版,所以解压就可以使用,如下图显示 启动成功
- Windows 10 +VS2019 编译OpenCV 4.1.0
准备环境 安装cmake 官网 获取代码 github 下载拓展库opencv_contrib github 生成Sln cmake安装完后桌面会有一个快捷方式,可打开cmakeGUI,打开它. 第一 ...
- mongoDB工具类以及测试类【java】
java操作mongo工具类 package Utils; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; im ...
- DLC 数制与数制的转换
进位计数值:用进位的方法进行计数 常用数值有十进制.二进制.八进制.十六进制等. 进位计数制把包括基数与权两个基本问题.
- iOS解决cell重用问题
在写sina 微博界面的过程中使用到了cell,那么就是在cell上添加一些控件,但是由于每条微博的内容都是不同的,所以在显示的过程中,出现了内容重叠的问题,其实就是UITableViewCell重用 ...
- Centos7.3 编译安装GDAL以及Python的GDAL包
参考: https://cryolite.iteye.com/blog/176382 https://blog.csdn.net/a13326021319/article/details/782505 ...
- 201772020113李清华《面向对象程序设计(java)》第九周学习总结
1.实验目的与要求 (1) 掌握java异常处理技术: (2) 了解断言的用法: (3) 了解日志的用途: (4) 掌握程序基础调试技巧: 2.实验内容和步骤 实验1:用命令行与IDE两种环境下编辑调 ...
- [DOM]初识DOM
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象 ...
- TypeError: Fetch argument 0 has invalid type <type 'int'>, must be a string or Tensor. (Can not convert a int into a Tensor or Operation.)
6月5日的時候,修改dilated_seg.py(使用tensorflow)出現了報錯: TypeError: Fetch argument 0 has invalid type <type ' ...
- MySQL创建数据库时指定编码utf8mb4和添加用户
CREATE DATABASE `wordpress` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE DATABASE `wor ...