Come posso essere avvisato quando una finestra viene chiusa da window.close (javascript)?

Mi è stato chiesto di riadattare un browser Web personalizzato creato attorno al controllo di IE 9. Uno dei requisiti era che tutte le windows pop-up devono essere catturate e reindirizzate in una nuova scheda. Il cliente non voleva che comparissero windows mobili stand-alone.

Lo sviluppatore precedente ha implementato la seguente funzione per acquisire questi casi e aprire una nuova scheda.

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; } 

Il problema si verifica quando una di queste windows aperte si aspetta di essere in grado di chiamare window.close da javascript.

Speravo di poter usare questa funzione

 public void WindowClosing(bool isChildWindow, ref bool cancel) 

per rilevare la chiamata javascript e chiudere la scheda. Ma questa funzione non viene mai chiamata. La stessa funzione javascript sembra funzionare. Il contenuto della scheda viene cancellato. Come posso rilevare questo scenario e chiudere la scheda?

Si noti che il controllo x attivo di IE9 non è un requisito difficile. Ma per favore non suggerire di cambiare i motori di rendering solo per motivi di purezza di Internet: P.

MODIFICARE:

Ecco la mia definizione dell’interfaccia DWebBrowserEvents2 in C #.

  [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); } 

Ho trovato una risposta qui: http://social.msdn.microsoft.com/Forums/en/winforms/thread/1cda7799-bf65-4c66-a3bf-488656998191 e ha funzionato per me.

Nel caso in cui quel link sparisca, ecco la risposta da quella pagina:

 // 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(); }