【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体
注:本文适用.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(),解决了这个,剩下就是把这事通知出去而已。
- 让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);
}
}
} - 剩下就简单了,宿主窗体响应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关闭本窗体的更多相关文章
- 【C#】无损转换Image为Icon 【C#】组件发布:MessageTip,轻快型消息提示窗 【C#】给无窗口的进程发送消息 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方 【C#】DataRowState演变备忘
[C#]无损转换Image为Icon 如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle ...
- JavaScript-打开新窗口(window.open)和 关闭窗口(window.close)
JavaScript-打开新窗口 open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: window.open([URL], [窗口名称], [参数字符串]) 参数说明: URL:可选 ...
- vue中$router.push打开新窗口
在vue中使用 this.$router.push({ path: '/home' }) 默认是替代本窗口 如果想新开一个窗口,可以使用下面的方式: let routeData = this.$ro ...
- JavaScript-打开新窗口
open()方法可以查找一个已经存在或者新建一个新的浏览器窗口. 语法:window.open([URL], [窗口名称], [参数字符串]) 参数解释: URL:可选参数,在窗口中显示网页的网址或路 ...
- JS页面跳转和打开新窗口方式
1.window.location.href=URL : 在本窗体打开一个新的页面,也是最常用的一种方法: 2.window.open(URL) : 在一个新的窗口打开一个新的页面: 3.loca ...
- C# webBrowser 开新窗口保持Session(转)
首先为项目添加引用 Microsoft Internet Controls public Form1() { InitializeComponent(); this.webBrowser1.Allow ...
- HTML页面中解决内容元素随窗口变化布局变乱问题
1.给body加上一个min-width最小宽度,以px为单位,这样当页面变小时,当达到你所设置的最小宽度,body的宽度不再改变,超出的部分会用横向滚动条显示,其内所有元素的布局也不会受影响. 2. ...
- 使“Cmder Here”菜单在Tab页开新窗口
Cmder是一个非常好用的的控制台命令行,我们在实际使用的时候,经常通过如下指令将其注册到右键菜单: Cmder.exe /REGISTER ALL 这样就可以在任意文件夹下快速打开Cmder,并且能 ...
- 【JS学习】慕课网2-7 练习题:制作新按钮,“新窗口打开网站” ,点击打开新窗口。
要求: 1.新窗口打开时弹出确认框,是否打开 提示: 使用 if 判断确认框是否点击了确定,如点击弹出输入对话框,否则没有任何操作. 2.通过输入对话框,确定打开的网址,默认为 http://www. ...
随机推荐
- angular2系列教程(八)In-memory web api、HTTP服务、依赖注入、Observable
大家好,今天我们要讲是angular2的http功能模块,这个功能模块的代码不在angular2里面,需要我们另外引入: index.html <script src="lib/htt ...
- Linux 常用命令(持续补充)
常用命令: command &:将进程放在后台执行 ctrl + z:暂停当前进程 并放入后台 jobs:查看当前后台任务 bg( %id):将任务转为后台执行 fg( %id):将任务调回前 ...
- WebGIS中等值线前端生成绘制简析
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 等值线是GIS制图中常见的功能,一般有两种思路:一种是先进行插 ...
- 来自于微信小程序的一封简讯
9月21晚间,微信向部分公众号发出公众平台-微信应用号(小程序)的内测邀请,向来较为低调的微信在这一晚没人再忽视它了. 来自个人博客:Damonare的个人博客 一夜之间火了的微信应用号你真的知道吗? ...
- javascript arguments(转)
什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments对象.所以agru ...
- 我的屌丝giser成长记-工作篇之B公司
从A公司跳槽到B公司,岗位还是webgis开发方向,但是具体实现的技术完全变了,从flex转换js,这也是我要离开A公司的最重要的原意之一:A公司的arcgis for flex框架采用了flexvi ...
- BPM应用开发解决方案分享
一.需求分析企业整体管理是一个完整的体系,如果 把这个体系比做一个拼图,企业信息化通过各个业务系统覆盖了一部分业务. 企业通过采购实施通用软件的方式,覆盖了企业的核心业务和专业化业务然而系统只满足了部 ...
- (转载) Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- Microsoft SQL Server中的事务与并发详解
本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...
- 深入理解jQuery、Angular、node中的Promise
最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...