【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体
2016-03-30 16:17
393 查看
注:本文适用.net 2.0+的winform项目
目的:
点击页面中的target="_blank"链接时,弹出新窗体
页面中有window.close()操作时,关闭窗体
上述窗体是指WebBrowser所在的Form,基本上,上述目的就是让该窗体表现得像个正常浏览器而已。
让wb知道页面执行了window.close(),并引发特定事件
方法是网上抄的,原理是页面执行window.close()时wb会收到一个特定的win32消息,于是可以重载wb的WndProc方法来处理这个消息,这就需要继承wb写一个子类,子类如下:
剩下就简单了,宿主窗体响应WebBrowserEx的WindowClosed事件,关闭自身就好。当然首先要把之前的WebBrowser换成上述WebBrowserEx,代码段:
- 文毕 -
目的:
点击页面中的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(); }
- 文毕 -
相关文章推荐
- 尼玛某前辈把ant 工程 改成android studio工程然后上传了 对我来说 尼玛这玩意就和屎一样
- 052(二)
- urllib2特点--超时设置
- 【九度】题目1061:成绩排序
- 在网页中显示PDF文档的方法
- [leetcode] 241. Different Ways to Add Parentheses
- Linux Shell常用技巧(四) awk
- JavaScript Date及Number对象
- 水池数目
- hdu-1272 小希的迷宫【并查集】
- POJ 3617 Best Cow Line
- 常见的数据结构和算法
- 正则表达式 - 语法
- 【转】JSP自定义标签
- Java中Runnable和Thread的区别
- Android实现获取验证码的倒计时功能
- 键盘 C语言虚拟按键值表
- 指定数组中的数据比大小
- Python Class之间函数的调用关系
- "现在已经正在使用此 SocketAsyncEventArgs 实例进行异步套接字操作"的处理