前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体

【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体

作者头像
AhDung
发布2018-09-13 11:11:57
9920
发布2018-09-13 11:11:57
举报
文章被收录于专栏:AhDungAhDung

注:本文适用.net 2.0+的winform项目

目的:

  • 点击页面中的target="_blank"链接时,弹出新窗体
  • 页面中有window.close()操作时,关闭窗体

上述窗体是指WebBrowser所在的Form,基本上,上述目的就是让该窗体表现得像个正常浏览器而已。

一、弹出新窗体

WebBrowser(下称wb)自带NewWindow事件,所以直接注册该事件即可:

代码语言:javascript
复制
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写一个子类,子类如下:
代码语言:javascript
复制
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);
        }
    }
}
  1. 剩下就简单了,宿主窗体响应WebBrowserEx的WindowClosed事件,关闭自身就好。当然首先要把之前的WebBrowser换成上述WebBrowserEx,代码段:
代码语言:javascript
复制
private WebBrowserEx wbex = new WebBrowserEx();
...

public FmMain()
{
    wbex.WindowClosed += wbex_WindowClosed;
    ...
}

void wbex_WindowClosed(object sender, System.EventArgs e)
{
    this.Close();
}

- 文毕 -

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-03-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、弹出新窗体
  • 二、响应页面中的window.close以关闭本窗体
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档