WebBrowser控件应用:弹出新窗体和关闭窗口
缘起:上次写了一个《WebBrowser控件的简单应用2》,提到了在NewWindow事件中打开新窗口的例子。有网友“队长 ”提出那个事件得到的参数是本页面的,而不是新页面的,经过测试,果然url参数不是新页面的。
Open新页面要处理的:
1:<<a href=’xxxxx’ target=’_blank’>>;
2: onclick=’window.open’ ;
3:引用js文件 ;
4:ClientScript.RegisterStartupScript();等。
5:还有要实现在打开的页面里能用window.opener对象
Close要处理的:
1:onclick=’window.close ;
2:引用js文件 ;
3:ClientScript.RegisterStartupScript()等。
经过在网上搜索,结果并不令人满意。基本上,WebBrowser控件不提供这个(将要打开的新页面的地址)功能,只能通过其他方法。
这里介绍一下网上的一个简单的解决方案、我的一个简单方案、微软的回答、一个终极解决方法。
网上现在有人给出这样的一个解决方案:在_NewWindow事件通过wb_Container.StatusText来获得当前将要打开的页面。代码可以这样写:
private void wb_Container_NewWindow(object sender, CancelEventArgs e)
{
e.Cancel = true;
string newURL = wb_Container.StatusText;
//'open
}
我测试了一下,这样做基本上只能处理<a href=’xxxxx’ target=’_blank’>的这种情况。对于<button>里面的onlcick事件window.open()毫无作用。
原因很简单,他只是利用了WebBrower现实Status的特点来做,不全面,不安全。至于其他情况也是完全不能处理,比如js中使用window.Open,这个方案根本不能检查。
我的处理方法:
刚开始,我使用了这样的思路:针对所有可能出现的情况,找个各个不同方法来处理。
比如说,对于<a herf=’’的这种情况,就用wb_Container.StatusText方法,但是要加入一个判断。If(wb_Container.StatusText!=””)。对于window.open和RegisterStartupScript的,可以通过替换js来实现。
本来的window.open函数,在程序完成加载之后,我把这个函数修改成window.external.open,
然后,我把我的AppBrowser类里面加入几个public的Open函数来对应原来的js的open函数就可以了。
这是一个代码实现。
private void wb_Container_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//for windows.open
if (wb_Container.DocumentText.IndexOf("window.open(") > -1 || wb_Container.DocumentText.IndexOf("window.close()") > -1)
{
wb_Container.DocumentText = wb_Container.DocumentText.Replace("window.open(", "window.external.open(").Replace("window.close()", "window.external.close()");
}
}
这样处理之后,保证了我的浏览器也能理解这些js。
这个方案唯一不能处理的就是js文件里面有处理的情况。
还有一个小问题,替换之后的document对象的action变化了。这个可以通过方法来实现,就是替换上边的函数,改用递归document.all来实现,检查每个element控件的内容来实现。
但是,毕竟美中不足。
微软的解释是这样的:这个问题,下一个版本在解决(http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115195),开发者可以通过扩展WebBrower及其Event来实现。并且提供了一个简单的代码(但是显示不完全)。是的,这是个好的解决方案,但不是我想要的。既然封装了这个控件,为什么不提供这么重要的一个参数呢?
有高手已经做出了一个模型:(http://www.codeproject.com/csharp/ExtendedWebBrowser.asp)
(作者实现了一个类似IE7效果的浏览器)
这个模型里面,作者自己封装并且扩展了这个控件,是个最终极的解决方法。
主要思路:提供了一个将要打开新窗口的事件,并且提供更多的参数。这些参数来自IWebBrowser2等接口,还提供了一些WndProc
重载来实现window.close。
下载之后,我保留了这些类,做了一个简单的测试
ExtendedWebBrowser : System.Windows.Forms.WebBrowser
.WebBrowserExtendedEvents : UnsafeNativeMethods.DWebBrowserEvents2
.WindowsMessages(enum)
UnsafeNativeMethods
.DWebBrowserEvents2([ComImport,
TypeLibType((short)0x1010), InterfaceType((short)2),
Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D")])
.IWebBrowser2([ComImport,
SuppressUnmanagedCodeSecurity,
TypeLibType(TypeLibTypeFlags.FOleAutomation | (TypeLibTypeFlags.FDual |
TypeLibTypeFlags.FHidden)),
Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E")])
BrowserExtendedNavigatingEventArgs : CancelEventArgs
UrlContext
ScriptError
NativeMethods
结果非常不错。
主要处理的几个地方:
NewWindow2
和
NewWindow3
:处理新打开窗口
BeforeNavigate2
:获得将要打开的窗口的地址。
主要提供的新事件:_StartNewWindow(object sender, BrowserExtendedNavigatingEventArgs e)
下边这一个是我的第二个AppBrowser类,使用上边封装扩展之后的WebBrower控件。
2 public partial class AppBrowser2 : Form
3 {
4 property
19 cons.
41
42 window : close and open
55 other browser event
92
93 external function for js
114 }
WebBrowser控件应用:弹出新窗体和关闭窗口的更多相关文章
- C# 禁止 Webbrowser 控件的弹出脚本错误对话框
当IE浏览器遇到脚本错误时浏览器,左下 角会出现一个黄色图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框.当我们使用 WebBrowser控件时有错误信息框弹出,这样程序显的很不友好,而 ...
- WPF 设置WebBrowser控件不弹脚本错误提示框
using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.N ...
- Unity3D NGUI UIPlayTween控件(一)动态打开关闭窗口
利用NGUI自带的脚本控件实现按钮点击窗口滑动出现与隐藏. 创建界面 首先建立如下图的三个BUtton与三个Panel 绑定脚本 然后在每个Button上添加UIPlayTween脚本,在Intera ...
- WebBrowser控件使用技巧分享
原文:WebBrowser控件使用技巧分享 在发布“淘宝登货员”时发现不少朋友对WebBrowser控件比较感兴趣,故在此分享一下使用心得. 首先分享一个WebBrowser的扩展类(此类所需的dll ...
- 【WPF】监听WPF的WebBrowser控件弹出新窗口的事件
原文:[WPF]监听WPF的WebBrowser控件弹出新窗口的事件 WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗 ...
- WPF Prism MVVM 中 弹出新窗体. 放入用户控件
原文:WPF Prism MVVM 中 弹出新窗体. 放入用户控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_37214567/artic ...
- VC-基础-WebBrowser控件中弹出新网页窗口
用webbrowser控件浏览网页时,常弹出新的网页窗口,若不做任何控制的话,会在默认浏览器(一般是IE)中打开,这样就在新的窗口打开了,原程序就很难控制了,且存在webbrowser控件和IE的se ...
- WPF中不规则窗体与WebBrowser控件的兼容问题解决办法
原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法 引言 这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序. ...
- C/S模式开发中如何利用WebBrowser控件制作导航窗体
原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...
随机推荐
- PE格式的理解(待补充)
PE文件格式 一.基本结构 1.DOS头一般到节区头成为PE头部分,其下称为PE体.文件的内容一般可分为代码(.text).数据(.data).资源(.rsrc),分别保存. 2.PE头与各节区的尾部 ...
- 颜色之RGBA
颜色之RGBA RGB是一种色彩标准,是由红(R).绿(G).蓝(B)的变化以及相互叠加来得到各式各样的颜色.RGBA是在RGB的基础上增加了控制alpha透明度的参数. 语法: color:rgba ...
- python解析xml之lxml
虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势.除了速度上的优势,lxml在使用方面,易用性也非常好.这里将以下面的xml数据为例,介绍l ...
- 网页数据采集 - 系列之Flash数据采集
经常看到一些朋友在讨论如何采集flash中的数据,讨论来讨论区,结论就是:flash不能采集,其实也不总是这样.本篇就跟大家分享如何采集flash中的数据. 在开始之前,先说明一下:一般来说flash ...
- KMP算法原理
前几天在看数据结构与算法,里面提到过kmp算法,一个超级经典的字符串匹配算法.虽然网上有一大堆关于kmp算法的介绍文章,但是我看过之后还是“不明觉厉”.所以打算自己写写,大家一起学习吧. 一.关于KM ...
- 03.Hibernate一对多关联
前言:在域模型中,类与类之间最普遍的关系就是关联关系,在UML语言中关联关系是有方向的.在数据库中表与表之间也会有关联关系,本节介绍通过Hibernate映射一对多的关联关系,这是一种最普遍的关联关系 ...
- 【BZOJ】【1042】【HAOI2008】硬币购物
DP+容斥原理 sigh……就差一点…… 四种硬币的数量限制就是四个条件,满足条件1的方案集合为A,满足条件2的方案集合为B……我们要求的就是同时满足四个条件的方案集合$A\bigcap B\bigc ...
- Linux命令 + Shell
1. 之前利用Ubuntu14.10的镜像安装了个虚拟机,本以为自己在windows上的就是管理员的权限,就理所当然的认为虚拟的Linux系统也是root权限.而且虽然@符号前的的标识不是root,但 ...
- Windows7 64位安装配置Apache2.4+PHP5.4+MySQL5.5+Xdebug
PHP更新已经到了5.4.7了,之前是用PHPstudy安装的PHP5.2.13版本,今天有空,就把之前的集成安装卸载了.换上了新一代PHP,记录一下.. 环境:Windows7 64位(内部版本76 ...
- NVelocity 在.Net的三种用法
NVelocity 使用文件型模板例子 using NVelocity; using NVelocity.App; using NVelocity.Runtime; VelocityEngine vl ...