2012-06-27 15 views
5

this answer पर आधारित है मैंने वेबब्राउज़र नियंत्रण में पॉपअप करने वाले जावास्क्रिप्ट अलर्ट बॉक्स को संभालने के लिए कस्टम DialogHandler बनाया है।वॉटर डायलॉग हैंडलर SaveFileDialog

Handler विरासत वाले WATN IE ब्राउज़र से जुड़ा हुआ है, जिसे ExtendedIeBrowser कहा जाता है।

किसी अज्ञात कारण के लिए वॉटन के डायलॉग हैंडलर Winforms SaveFiledialogs में हस्तक्षेप करते हैं। SaveFileDialog स्वचालित रूप से DialogResult.Cancel लौटकर बंद हो जाता है। अजीब चीज यह है कि कस्टम हैंडलर के Handle() को कभी नहीं कहा जाता है। केवल CanHandle() को (दो बार) कहा जाता है और यह झूठा होता है, इसलिए संवाद को संभाला नहीं जाना चाहिए, इसलिए इसे खुला रहना चाहिए।

क्या कोई ऐसा काम है जो मैं इस अजीब व्यवहार को दूर करने के लिए कर सकता हूं?

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 स्रोत के बाद:

यह 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

मुझे नहीं पता था कि वॉटर वेबब्राउज़र के अलावा अन्य संवादों में हस्तक्षेप कर सकता है !! – Odys

उत्तर

0

इस प्रयास करें:

WatiN.Core.Settings.AutoCloseDialogs = false; 

डिफ़ॉल्ट रूप से true को तैयार है।

संबंधित मुद्दे