缘起:上次写了一个《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

结果非常不错。

主要处理的几个地方:

NewWindow2NewWindow3:处理新打开窗口

BeforeNavigate2:获得将要打开的窗口的地址。

主要提供的新事件:_StartNewWindow(object sender, BrowserExtendedNavigatingEventArgs e)

下边这一个是我的第二个AppBrowser类,使用上边封装扩展之后的WebBrower控件。

  1    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
  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控件应用:弹出新窗体和关闭窗口的更多相关文章

  1. C# 禁止 Webbrowser 控件的弹出脚本错误对话框

    当IE浏览器遇到脚本错误时浏览器,左下 角会出现一个黄色图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框.当我们使用 WebBrowser控件时有错误信息框弹出,这样程序显的很不友好,而 ...

  2. WPF 设置WebBrowser控件不弹脚本错误提示框

    using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.N ...

  3. Unity3D NGUI UIPlayTween控件(一)动态打开关闭窗口

    利用NGUI自带的脚本控件实现按钮点击窗口滑动出现与隐藏. 创建界面 首先建立如下图的三个BUtton与三个Panel 绑定脚本 然后在每个Button上添加UIPlayTween脚本,在Intera ...

  4. WebBrowser控件使用技巧分享

    原文:WebBrowser控件使用技巧分享 在发布“淘宝登货员”时发现不少朋友对WebBrowser控件比较感兴趣,故在此分享一下使用心得. 首先分享一个WebBrowser的扩展类(此类所需的dll ...

  5. 【WPF】监听WPF的WebBrowser控件弹出新窗口的事件

    原文:[WPF]监听WPF的WebBrowser控件弹出新窗口的事件 WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗 ...

  6. WPF Prism MVVM 中 弹出新窗体. 放入用户控件

    原文:WPF Prism MVVM 中 弹出新窗体. 放入用户控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_37214567/artic ...

  7. VC-基础-WebBrowser控件中弹出新网页窗口

    用webbrowser控件浏览网页时,常弹出新的网页窗口,若不做任何控制的话,会在默认浏览器(一般是IE)中打开,这样就在新的窗口打开了,原程序就很难控制了,且存在webbrowser控件和IE的se ...

  8. WPF中不规则窗体与WebBrowser控件的兼容问题解决办法

    原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法 引言 这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序. ...

  9. C/S模式开发中如何利用WebBrowser控件制作导航窗体

    原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...

随机推荐

  1. 第一个完整的cppunit单元测试程序

    在极限编程中,测试程序本应该在编写主程序之前就要写好,然后将写好的类程序放在测试程序中进行测试,但考虑到项目中需求文档等并未将接口定义好,我无从开始,而且,自己对单元测试也是刚刚熟悉,需要一边写测试程 ...

  2. 快逸报表部署 (一)-- demo连接mysql数据库

    1. 设计器连接mysql数据库, 创建first.raq报表文件 2. 创建demo.jsp,嵌入报表,jsp顶部加入下面两行 <%@ page contentType="text/ ...

  3. linux 安装memcached

    1.下载文件wget http://www.monkey.org/~provos/libevent-1.4.12-stable.tar.gzwget http://www.memcached.org/ ...

  4. 异步HTTP请求

    一.自定义异步的HTTP请求 1.自定义一个AsyncHttpClient类,用于处理HTTP请求,实际原理就是新开启一个线程,调用HttpClient处理GET和POST请求 package com ...

  5. 代码优先-Code First

    非常有用的两篇文章 MSDN:Code First 迁移 博客园:CodeFirst数据迁移(不丢失数据库原有数据) EF有三种开发模式:Model First,Database First 和 Co ...

  6. aspose.cell 自定义模板 SUM无效

    数字类型的单元格, 显示   解决方案: 绑定的DataTable的列为字符串类型. 应该将其设置成数字类型的列

  7. .Net 执行 Oracle SQL语句时, 中文变问号

      带中文的Sql语句在.Net调用时, 中文变问号(可使用 SQL Tracker工具跟踪)   问题:       服务器的字符集与客户端的字符集不一致. 解决方法: 1.  查看服务端的字符集: ...

  8. wordpress无法安装这个包。: PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file 'C:\WINDOWS\TEMP/wordpress-4.tmp'

    朋友的wp博客好久没管理了,让ytkah帮忙打理一下,进到后台发现版本还是3.9的,那是比较早以前的版本了,早该升级了. 在升级wordpress时出现以下错误: 无法安装这个包: PCLZIP_ER ...

  9. WaitForTargetFPS

    WaitForTargetFPS,是关于帧数限制的,你可能开了垂直同步,其实是防止撕裂.先说撕裂,在显示器的帧缓存会被不同步的显卡的帧缓存给替换掉,导致显示器显示到一半的时候,内存被换掉,你看到上频是 ...

  10. 从CMO到龙泉寺弟子:佛法改变人生

    今天,移动精英开发社为大家请来了佛家弟子孫濟初师兄给大家分享学佛心得.濟初师兄根据自己的亲身经历,讲述了佛法对他人生的影响,以及他所获得的启示.本文系国内ITOM管理平台OneAPM授权转载. 孫濟初 ...