2012-06-27 2 views
5

this answerに基づいて、Webブラウザーコントロール内からポップアップするJavascript警告ボックスを処理するカスタムDialogHandlerを作成しました。Watin DialogHandler閉じるSaveFileDialog

Handlerは、継承WatiN IEブラウザ(ExtendedIeBrowser)に添付されています。

watinのDialogHandlerが原因で、Winforms SaveFiledialogsが妨げられます。 SaveFileDialogはDialogResult.Cancelを返して自動的に閉じます。奇妙なことは、カスタムHandlerのHandle()が呼び出されないことです。 CanHandle()のみ(2回)呼び出され、falseを返すので、ダイアログはまったく処理されないため、開いたままにしてください。

私はこの奇妙な行動を克服するために何かできることはありますか? CustomPopupDialogHandlerソースに続き

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

これはExtendedIeBrowser源である

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に設定されています。