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;
}
}
私はWatinが 'WebBrowser'のもの以外のダイアログに干渉するのを知りませんでした! – Odys