检测是否有任何Confirm MessageBox已打开

时间:2013-12-19 09:43:08

标签: c# forms webbrowser-control

我在辅助表单中使用WebBrowser对象来打开url,当web加载时,获取并关闭该表单,但是我遇到了一些麻烦。

我有一个8秒钟的Timer(),如果表格在8秒后仍然存在,表格将被强制关闭。

WebBrowser是一个糟糕的导航器,所以我在一些网站上得到一个“alert()”告诉我需要升级我的导航器。当WebBrowser对象加载“alert()”时,它会像我的应用程序一样显示在我的应用程序中,所以我需要先关闭该消息,然后关闭我的导航器表单。

为此,我这样做了:

主要形式:

    int cont = 0;

    void t_Tick(object sender, EventArgs e)
    {
        cont += 1;            

        if (cont == 8)
        {
            var formularios = Application.OpenForms;

            for (int i = formularios.Count - 1; i >= 0; i--)
            {
                if (formularios[i] != this)
                {
                    formularios[i].Dispose();
                }
            }

            t.Enabled = false;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        t.Enabled = true;

        p = new FormNavigator();

        p.Navigate("URL HERE");
        p.ShowDialog();

    }

它适用于我的“alert()”函数,但是一些网站使用“confirm()”函数,它打开一个带有OK / Cancel按钮的表单......并且Application.OpenForms没有检测到它

您知道从.NET中检测这些“确认”对话框的方法吗?

问候。

更新

我在WebBrowser对象中有这个属性:

    navigator.ScriptErrorsSuppressed = true;
    navigator.AllowWebBrowserDrop = true;
    navigator.IsWebBrowserContextMenu = false;
    navigator.WebBrowserShortcutsEnabled = false;

我已经像这样处理了NewWindow事件:

    private void navivator_NewWindow(object sender, CancelEventArgs e)
    {
        e.Cancel = true;
    }

2 个答案:

答案 0 :(得分:0)

AFAIK没有内置功能可以做到这一点但你可以使用这个来压制所有对话框消息

//隐藏所有来自底层ActiveX控件的对话框,而不仅仅是脚本错误

   webBrowser1.ScriptErrorsSuppressed = true; 

答案 1 :(得分:0)

可以通过实现IDocHostShowUI

来完成
int IDocHostShowUI.ShowMessage(IntPtr hwnd, string lpstrText, string lpstrCaption, int dwType, string lpstrHelpFile, int dwHelpContext, out int lpResult)
{
    // return handled
    //  S_OK        Host displayed its UI. MSHTML does not display its message box.
    //  S_FALSE     Host did not display its UI. MSHTML displays its message box.
    //
    if (this.CloseOpenDialogs == true)
    {
        lpResult = 0;
        return S_OK;
    }
    else
    {
        lpResult = 0;
        return S_FALSE;
    }
}