2012-06-27 18 views
5

Basado en this answer He creado un personalizado DialogHandler para manejar cuadros de alerta de Javascript que aparecen desde un control WebBrowser.Watin DialogHandler se cierra SaveFileDialog

El Handler está conectado a un navegador heredado WatiN IE, llamado ExtendedIeBrowser.

Por una razón desconocida DialogHandler de Watin interfiere con Winforms SaveFiledialogs. El SaveFileDialog se cierra automáticamente al devolver DialogResult.Cancel. Lo extraño es que nunca se llama al Handle() del controlador personalizado. Solo se llama a CanHandle() (dos veces) y devuelve falso, por lo que no se supone que deba manejarse el cuadro de diálogo, por lo tanto, debe permanecer abierto.

¿Hay algo que pueda hacer para cambiar este extraño comportamiento?

Ésta es la fuente de ExtendedIeBrowser:

public class ExtendedIeBrowser : IE 
{ 
    private IntPtr hwnd; 
    public ExtendedIeBrowser(WebBrowser webBrowserControl) : base(webBrowserControl.ActiveXInstance, false) 
    { 
    } 

    public void Initialize(WebBrowser webBrowserControl) 
    { 
     hwnd = webBrowserControl.FindForm().Handle; 
     StartDialogWatcher(); 
    } 

    public override IntPtr hWnd { get { return hwnd; } } 

    protected override void Dispose(bool disposing) 
    { 
     hwnd = IntPtr.Zero; 
     base.Dispose(disposing); 
    } 
} 

Siguiendo la fuente CustomPopupDialogHandler:

class CustomPopupDialogHandler : ReturnDialogHandler 
{ 
    protected static Logger _logger = LogManager.GetCurrentClassLogger(); 

    public override bool HandleDialog(Window window) 
    { 
     bool handled = false; 
     try 
     { 
      var button = GetWantedButton(window); 
     if (button != null) 
     { 
      button.Click(); 
     } 
      handled = true; 
     } 
     catch (Exception ex) 
     { 
      _logger.ErrorException("HandleDialog", ex); 
     } 
     return handled; 
    } 

    public override bool CanHandleDialog(Window window) 
    { 
     bool canHandle = false; 
     try 
     { 
     canHandle = GetWantedButton(window) != null; 
     } 
     catch (Exception ex) 
     { 
      _logger.ErrorException("CanHandleDialog", ex); 
     } 
     return canHandle; 
    } 

    private WinButton GetWantedButton(Window window) 
    { 
     WinButton button = null; 
     try 
     { 
      if (window.Title.Contains("Windows Internet Explorer") || window.Title.Contains("Message from webpage")) 
      { 
       var windowButton = new WindowsEnumerator().GetChildWindows(window.Hwnd, w => w.ClassName == "Button" && (new WinButton(w.Hwnd).Title.Contains("Leave") || new WinButton(w.Hwnd).Title.Contains("OK")).FirstOrDefault(); 
       if (windowButton != null) 
       { 
        string s = windowButton.Title; 
        button = new WinButton(windowButton.Hwnd); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      _logger.ErrorException("GetWantedButton", ex); 
     } 
     return button; 
    } 
} 
+0

¡No sabía que watin podía interferir con diálogos que no fueran 'WebBrowser' !! – Odys

Respuesta

0

Prueba esto:

WatiN.Core.Settings.AutoCloseDialogs = false; 

Por defecto se establece en true.