【问题标题】:Accept native dialog in WebBrowser接受 WebBrowser 中的本机对话框
【发布时间】:2014-05-04 12:46:25
【问题描述】:

我有以下代码

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (current_state == "request_4")
    {
        webBrowser1.Invoke(new Action(() => webBrowser1.ScriptErrorsSuppressed = true));
        webBrowser1.Invoke(new Action(() => webBrowser1.Refresh(WebBrowserRefreshOption.Completely)));
        InjectAlertBlocker();
    }
}
private void InjectAlertBlocker()
{
    HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
    HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
    string alertBlocker = "window.alert = function () { }";
    element.text = alertBlocker;
    head.AppendChild(scriptEl);
}

我正在执行的请求的刷新是 POST 请求,因此 WebBrowser 实例一直在询问我是否要通过显示对话框窗口来“重试”请求。如何接受或根本不显示?

抑制错误或InjectAlertBlocker() 无济于事。

我不是很了解http://www.codeproject.com/Articles/31163/Suppressing-Hosted-WebBrowser-Control-Dialogs这种做法。

如果有人能解释如何使用该解决方案,我将不胜感激。

【问题讨论】:

    标签: c# webbrowser-control


    【解决方案1】:

    该代码成功了,但我仍然不喜欢它,因为它从我正在使用的当前窗口获取焦点。

    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    private static extern IntPtr FindWindow(string lp1, string lp2);
    [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll", SetLastError = true)]
    public static  extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
    System.Timers.Timer aTimer = new System.Timers.Timer();
    private void request_refresh()
    {
        WebBrowserReadyState state1 = WebBrowserReadyState.Complete;
        webBrowser1.Invoke(new Action(() => webBrowser1.ScriptErrorsSuppressed = true));
        webBrowser1.Invoke(new Action(() => webBrowser1.Refresh(WebBrowserRefreshOption.Completely)));
        while (state1 != WebBrowserReadyState.Complete)
        {
            Application.DoEvents();
        }
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Interval = 10;
        aTimer.Enabled = true;
    }
    private void OnTimedEvent(object source, ElapsedEventArgs exc)
    {
        try
        {
            var handle = IntPtr.Zero;
            handle = FindWindowEx(IntPtr.Zero, handle, "#32770", "Web-browser");
            if (!handle.Equals(IntPtr.Zero))
            {
                if (SetForegroundWindow(handle))
                {
                    SendKeys.SendWait("{ENTER}");
                    aTimer.Stop();
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2013-09-02
      • 2017-02-28
      • 2012-09-03
      相关资源
      最近更新 更多