2012-06-27 31 views
5

基於this answer我創建了自定義DialogHandler來處理從WebBrowser控件內彈出的Javascript警報框。Watin DialogHandler關閉SaveFileDialog

Handler附加到繼承的WatiN IE瀏覽器,名爲ExtendedIeBrowser

watin的DialogHandler會干擾Winforms SaveFiledialogs。 SaveFileDialog通過返回DialogResult.Cancel自動關閉。奇怪的是,自定義處理程序的Handle()從不被調用。只有CanHandle()被調用(兩次),它返回false,所以對話不應該被處理,因此它應該保持打開狀態。

有什麼我可以做的改變克服這種奇怪的行爲?

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

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

我不知道watin可以干擾除「WebBrowser」之外的對話框! – Odys

回答

0

試試這個:

WatiN.Core.Settings.AutoCloseDialogs = false; 

默認設置爲true