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


    注:本文适用.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
      {
          /// <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);
              }
          }
      }
      复制代码
    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();
      }
      复制代码

    -

  • 相关阅读:
    多重继承的构造函数和析构函数的执行顺序(包含虚基类)
    java解析XML之DOM解析和SAX解析(包含CDATA的问题)
    java解析XML之DOM解析和SAX解析(包含CDATA的问题)
    计算机网络总结之运输层
    Method, apparatus, and system for speculative abort control mechanisms
    [转]如何用adb控制MTKLogger
    反转单向、双向链表
    删除链表中间节点和a/b处的节点
    Android 中log 找到关键log
    在单链表和双链表中删除倒数第k个结点
  • 原文地址:https://www.cnblogs.com/soundcode/p/12456698.html
Copyright © 2020-2023  润新知