注:本文适用.net 2.0+的winform项目

目的:

  • 点击页面中的target="_blank"链接时,弹出新窗体
  • 页面中有window.close()操作时,关闭窗体

上述窗体是指WebBrowser所在的Form,基本上,上述目的就是让该窗体表现得像个正常浏览器而已。

一、弹出新窗体

WebBrowser(下称wb)自带NewWindow事件,所以直接注册该事件即可:

private void wb_NewWindow(object sender, CancelEventArgs e)
{e.Cancel = true;//这句加不加在我的环境里没区别,不加也不会导致打开外部浏览器new FmWebBrowser(wb.StatusText).Show(); //FmWebBrowser即我的承载wb的窗体,本类构造函数接受一个url,Show之后会令wb访问该url。另外,该事件进入时,wb的StatusText几乎可以断定就是所点链接的href,极端情况以后遇到再说
}

二、响应页面中的window.close以关闭本窗体

由于wb没有现成的Close之类的事件,所以这个要稍稍折腾一下,就是给它加上这个事件,核心要解决的问题,就是让wb知道页面执行了window.close(),解决了这个,剩下就是把这事通知出去而已。

  1. 让wb知道页面执行了window.close(),并引发特定事件

    方法是网上抄的,原理是页面执行window.close()时wb会收到一个特定的win32消息,于是可以重载wb的WndProc方法来处理这个消息,这就需要继承wb写一个子类,子类如下:

    using System;
    using System.Security.Permissions;
    using System.Windows.Forms;namespace AhDung.WinForm.Controls
    {/// <summary>/// 增强型浏览器/// </summary>public class WebBrowserEx : WebBrowser{/// <summary>/// 当WebBrowser关闭后/// </summary>public event EventHandler WindowClosed;protected void OnWindowClosed(EventArgs e){if (WindowClosed != null) { WindowClosed(this, e); }}[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]protected override void WndProc(ref Message m){if (m.Msg == 0x210/*WM_PARENTNOTIFY*/){int wp = m.WParam.ToInt32();int X = wp & 0xFFFF;if (X == 0x2/*WM_DESTROY*/)//若收到该消息,引发WindowClosed事件{OnWindowClosed(EventArgs.Empty);}}base.WndProc(ref m);}}
    }
    

  2. 剩下就简单了,宿主窗体响应WebBrowserEx的WindowClosed事件,关闭自身就好。当然首先要把之前的WebBrowser换成上述WebBrowserEx,代码段:
    private WebBrowserEx wbex = new WebBrowserEx();
    ...public FmMain()
    {wbex.WindowClosed += wbex_WindowClosed;...
    }void wbex_WindowClosed(object sender, System.EventArgs e)
    {this.Close();
    }
    

-

WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体相关推荐

  1. JavaScript-打开新窗口(window.open)

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 < ...

  2. JS-打开新窗口(window.open)/关闭窗口(window.close)

    打开新窗口(window.open) open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: window.open([URL], [窗口名称], [参数字符串]) 参考说明: URL: ...

  3. 给页面中的所有链接新窗口中打开

    在head标签里加<base target="_blank">,这样页面中所有的a链接都是新窗口中打开了.. 转载于:https://www.cnblogs.com/w ...

  4. html中open打开新网页,JavaScript-打开新窗口(window.open)

    window.open function Wopen(){ window.open('http://www.imooc.com','_blank','width=600,height=400,top= ...

  5. vue是用a标签打开新页面_vue | 路由vue-router在新窗口打开页面

    vue的是单页面应用设计的渐进式框架,但是有时在项目中也会出现新窗口打开页面的情况,此时,就需要vue-router的知识来解决 一.使用标签 需要注意的是,router-link并不支持 targe ...

  6. vue,下载导出文件,开新窗口导出

    vue,下载导出文件,开新窗口导出 封装 设置url参数方法 //设置url参数 //setUrlPrmt({'a':1,'b':2}) //显示 a=1&b=2 setUrlPrmt(obj ...

  7. 页面跳转与打开新窗口的方法---前端

    JS页面跳转与打开新窗口的方法-前端 JS页面跳转与打开新窗口的方法-前端## 标题

  8. js -- 打开新窗口(window.open)、关闭窗口(window.close)

    open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: window.open([URL], [窗口名称], [参数字符串]) 参数说明: URL:可选参数,在窗口中要显示网页的网址或路 ...

  9. _blank开新窗口不符合标准?

    本文参考了以下文章: Kevin Yank的<New-Window links in a Standards-Compliant World> <Standards-based Re ...

最新文章

  1. Ubuntu14.04 + Matlab2014a + caffe + cuda + cudnn环境搭建
  2. mybatis入门配置——基于xml配置
  3. Python 堡垒机介绍
  4. java util logging_简单日志记录,使用java.util.logging
  5. 爱立信首席执行官卫翰思离职 投资者已失去耐性
  6. 暴跌300亿,“撤离”中国!乔布斯12年前憋的大招,又把一个巨头逼下神坛
  7. 数据挖掘:模型选择——关联规则
  8. PHP openssl加密扩展使用总结
  9. 使用Mybatis-Generator自动生成entity实体、dao接口以及mapper映射文件
  10. 偷懒才能编程序——计算机达人成长之路(18)
  11. xp 无法关闭计算机,xp系统不能关机了怎么办
  12. OpenGL Mathematics (GLM)
  13. 2022年全球光纤机械接头市场前景分析及研究报告
  14. QlikView常用函数(整理)
  15. MAC 网桥-交换机
  16. NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突
  17. python京东抢购软件_[Python] 京东秒杀商品抢购-茅台抢购自动获取抢购时间【修改】...
  18. java窗体背景图片_java 窗体设置背景图片问题 (附上登陆界面代码,我想加个背景图...
  19. [模型库]两款经典puma560机器人三维模型
  20. 在网上看看非诚勿扰,要不要报名

热门文章

  1. QML模块定义qmldir文件
  2. Qt Creator将纹理附加到材质
  3. OpenGL Multi Texture多重纹理的实例
  4. C++Merege Sort合并排序的实现算法(附完整源码)
  5. C++实现hopcroft karp霍普克洛夫特-卡普算法(附完整源码)
  6. 「Python」超简单!Python返回矩阵最大元素/最小值坐标,三行搞定!(更新:一行搞定!)
  7. MyBatis 批量更新,批量更新
  8. 删除文件后,磁盘空间没有释放的处理记录
  9. Spark自带的集群模式(Standalone),Spark/Spark-ha集群搭建
  10. Notepad++插件之ftp/sftp远程编辑功能,以及各种插件(转:http://blog.csdn.net/happy_wu/article/details/73302994)