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;
}
}
watin 'WebBrowser'ın dışındaki diyaloglara müdahale edebileceğini bilmiyordum !! – Odys