c# - 当 window.close (javascript) 关闭窗口时,如何通知我?

标签 c# javascript webbrowser-control

我被要求改造一个围绕 IE 9 控件构建的自定义 Web 浏览器。要求之一是必须捕获所有弹出窗口并将其重定向到新选项卡。客户不希望出现任何 float 的独立窗口。

之前的开发人员实现了以下功能来捕获这些案例并打开一个新选项卡。

public void NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl)
{
    BrowserExtendedNavigatingEventArgs args = new BrowserExtendedNavigatingEventArgs(ppDisp, new Uri(bstrUrl), null, (UrlContext)dwFlags);
    _Browser.OnStartNewWindow(args);
    Cancel = args.Cancel;
    ppDisp = args.AutomationObject;
}

当这些打开的窗口之一期望能够从 javascript 调用 window.close 时,就会出现问题。

我希望我能使用这个功能

public void WindowClosing(bool isChildWindow, ref bool cancel)

检测 JavaScript 调用并关闭选项卡。但这个函数永远不会被调用。 javascript 函数本身似乎可以工作。选项卡的内容被清除。我如何检测这种情况并关闭选项卡?

请注意,IE9 active x 控件不是硬性要求。但请不要建议我仅仅为了互联网的纯洁性而切换渲染引擎:P。

编辑:

这是我在 C# 中对 DWebBrowserEvents2 接口(interface)的定义。

    [ComImport, TypeLibType((short)0x1010), InterfaceType((short)2), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D")]
    public interface DWebBrowserEvents2
    {
        [DispId(0x111)]
        void NewWindow3(
            [In, Out, MarshalAs(UnmanagedType.IDispatch)] ref object ppDisp, 
            [In, Out] ref bool Cancel,
            [In] uint dwFlags, 
            [In, MarshalAs(UnmanagedType.BStr)] string bstrUrlContext, 
            [In, MarshalAs(UnmanagedType.BStr)] string bstrUrl);

        [DispId(253)]
        void OnQuit();

        [DispId(263)]
        void WindowClosing(
            [In] bool isChildWindow,
            [In, Out] ref bool cancel);

        [DispId(283)]
        void WindowStateChanged(
            [In] uint dwFlags,
            [In] uint dwVAlidFlagsMask);

        [DispId(271)]
        void NavigateError(
            [In, MarshalAs(UnmanagedType.IDispatch)] object pDisp,
            [In] ref object URL, [In] ref object frame,
            [In] ref object statusCode, [In, Out] ref bool cancel);
    }

最佳答案

在这里找到答案:http://social.msdn.microsoft.com/Forums/en/winforms/thread/1cda7799-bf65-4c66-a3bf-488656998191这对我有用。

如果该链接消失,以下是该页面的答案:

// A delegate type for hooking up close notifications.
public delegate void ClosingEventHandler(object sender, EventArgs e);

// We need to extend the basic Web Browser because when a web page calls
// "window.close()" the containing window isn't closed.
public class ExtendedWebBrowser : WebBrowser
{
  // Define constants from winuser.h
  private const int WM_PARENTNOTIFY = 0x210;
  private const int WM_DESTROY = 2;

  public event ClosingEventHandler Closing;

  protected override void WndProc(ref Message m)
  {
    switch (m.Msg)
    {
      case WM_PARENTNOTIFY:
        if (!DesignMode)
        {
          if (m.WParam.ToInt32() == WM_DESTROY)
          {
            Closing(this, EventArgs.Empty);
          }
        }
        DefWndProc(ref m);
        break;
      default:
        base.WndProc(ref m);
        break;
    }
  }
}

//Then your containing class has the following:
private ExtendedWebBrowser browserControl;
this.browserControl.Closing +=new ClosingEventHandler(browserControl_Closing);
private void browserControl_Closing(object sender, EventArgs e)
{
  this.Close();
}

关于c# - 当 window.close (javascript) 关闭窗口时,如何通知我?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9101113/

相关文章:

javascript - 长时间运行的异步 API 方法

JavaScript 动态扩展/收缩矩阵 - 如何实现?

.net - 检测到重入

javascript - WebBrowser 源已过时

c# - 包含 AJAX 按钮的屏幕抓取网页

c# - EF 6 中缺少 QueryableExtensions

c# - SQL 数据库 : search more than one column

javascript - Highcharts Sunburst 图表钻取

javascript - 全日历js : fetching more events with ajax

c# - 通过 HttpClient 使用外部 REST Web 服务的存储库模式示例?