博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体
阅读量:4913 次
发布时间:2019-06-11

本文共 1998 字,大约阅读时间需要 6 分钟。

注:本文适用.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(),解决了这个,剩下就是把这事通知出去而已。

  1. 让wb知道页面执行了window.close(),并引发特定事件

    方法是网上抄的,原理是页面执行window.close()时wb会收到一个特定的win32消息,于是可以重载wb的WndProc方法来处理这个消息,这就需要继承wb写一个子类,子类如下:

    using System;using System.Security.Permissions;using System.Windows.Forms;namespace AhDung.WinForm.Controls{    ///     /// 增强型浏览器    ///     public class WebBrowserEx : WebBrowser    {        ///         /// 当WebBrowser关闭后        ///         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);        }    }}
  2. 剩下就简单了,宿主窗体响应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();}

- 文毕 -

posted on
2016-03-30 16:17 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/ahdung/p/5337665.html

你可能感兴趣的文章
Oracle CASE WHEN 用法介绍
查看>>
linux 下连接mysql服务器
查看>>
DOMContentLoad 首屏渲染
查看>>
rpm检验是否被改动过
查看>>
Sphinx-简介及原理
查看>>
【Linux】深入理解Linux中内存管理
查看>>
WEB 移动网站 手机点击 打电话 发短信
查看>>
2019CSUST集训队选拔赛题解(一)
查看>>
李晓菁201771010114《面向对象程序设计(Java)》第三周学习总结
查看>>
Typedef与Struct
查看>>
Linux常用网络命令整理
查看>>
JMeter学习笔记--使用URL回写来处理用户会话
查看>>
Error creating bean with name 'documentationPluginsBootstrapper' defined in URL
查看>>
Javascript样例之文档章节滚动全版(DOM)
查看>>
C++ 面向对象
查看>>
Maven Nexus
查看>>
js 判断滚动条的滚动方向
查看>>
关于springboot启动时候报错:springboot Failed to parse configuration class [Application]
查看>>
java中Class的使用详解
查看>>
css,js文件后面加一个版本号
查看>>