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开发.用过市面上常见 ...
随机推荐
- 启动级别:init 0,1,2,3,4,5,6
这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下.. 0:停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system 3:完全多用户 5:图形化 ...
- Bootstrap入门三:页面排版
在Bootstrap中,页面的排版都是从全局的概念上出发,定制了主体文本.强调文本.标题.Code风格.按钮.表单.表格等格式,并运用CSS3的@font-face和伪元素一起实现了一套icon主题. ...
- HTML5 编码规范
在编写HTML时,可能有一些方面不够规范,在通过对<HTML5编码规范>的学习后,采用代码注解的方式,做相关的整理,方便今后回顾. <!DOCTYPE html> <!- ...
- hdu 2686 Matrix 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...
- Rich Text Editor for MVC
在网站开发中难免会用到富文本编辑器,本文将介绍一款富文本编辑器(在线HTML编辑器) Rich Text Editor ,简要说明一下其在MVC中的使用. 具体使用情况和下载地址请参考:http:// ...
- android解析XML总结(SAX、Pull、Dom三种方式) <转载>
android解析XML总结(SAX.Pull.Dom三种方式) http://www.cnblogs.com/JerryWang1991/archive/2012/02/24/2365507.htm ...
- c++ assert
#include<iostream> #include <assert.h> using namespace std; int main() { ; assert(a == ) ...
- GIS数据格式topojson
Topojson源自于GeoJson,是D3中描述地理数据的格式,D3的作者觉得GeoJson太繁琐.同样的数据,TopoJson是GeoJson的1/5. 这里有一个转换TopoJson,GeoJs ...
- jQuery1.9.1源码分析--Events模块
var rformElems = /^(?:input|select|textarea)$/i, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contex ...
- POJ 2151 Check the difficulty of problems (概率dp)
题意:给出m.t.n,接着给出t行m列,表示第i个队伍解决第j题的概率. 现在让你求:每个队伍都至少解出1题,且解出题目最多的队伍至少要解出n道题的概率是多少? 思路:求补集. 即所有队伍都解出题目的 ...