2012-06-27 15 views
5

this answer Tabanlı bir WebBrowser denetiminin içinden açılan Javascript uyarı kutularını işlemek için özel bir DialogHandler oluşturdum.Watin DialogHandler, SaveFileDialog'u kapatır

Handler, ExtendedIeBrowser adlı bir kalıtsal WatiN IE tarayıcısına eklenmiştir.

Bilinmeyen bir nedenle, watin's DialogHandler, Winforms SaveFiledialogs ile çakışıyor. DialogResult.Cancel'i döndürerek SaveFileDialog otomatik olarak kapatılır. Garip olan şey özel işleyicinin Handle() hiç çağrılmadığıdır. Sadece CanHandle() (iki kez) çağrılır ve yanlış döndürülür, bu yüzden iletişim kutusunun ele alınması gerekmez, bu nedenle açık kalmalıdır.

Bu garip davranışın üstesinden gelmek için yapabileceğim bir şey var mı? CustomPopupDialogHandler kaynağı takiben

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

:

Bu ExtendedIeBrowser kaynağıdır

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

watin 'WebBrowser'ın dışındaki diyaloglara müdahale edebileceğini bilmiyordum !! – Odys

cevap

0

bu deneyin: Varsayılan olarak

WatiN.Core.Settings.AutoCloseDialogs = false; 

true ayarlanır.