如何检测winforms应用程序何时创建新窗口?

时间:2015-09-30 00:24:00

标签: c# winforms webbrowser-control

我在表单应用程序中使用了webbrowser控件,我想阻止它可以创建的任何弹出/警报/提示窗口。

目前,我正在实施各种方法来阻止弹出窗口:

  • 取消创建新窗口时触发的各种事件。
  • 通过注册表更改全局IE设置,使其显示更少 提醒和提示。
  • 使用浏览器功能控件阻止某些弹出窗口。
  • 将javascript注入每个页面以禁用可以创建新窗口的功能。
  • 通过实现允许我这样的IDocHostShowUI之类的东西,使用新事件扩展Web浏览器控件 阻止某些弹出窗口。
  • 使用"隐藏"基本activeX webbrowser对象的事件,如NewWindow2和NewWindow3。

所有这些组合块阻止了webbrowser控件可以创建的所有窗口的99%(1%是一些非常罕见的情况,比如在iframe中调用的javascript prompt()函数,该文档位于不同的域上父窗口,仍然没有办法阻止:D)。

但是它有很多代码,使它变得很乱,有时会干扰正常浏览。 我想知道是否有不同的方法。由于webbrowser控件创建的大多数窗口实际上是由我的应用程序的进程创建的,有没有办法检测我的应用程序何时创建任何类型的窗口而不是主窗体并立即关闭它或阻止它它的创作完全是什么?

更新

我已尝试覆盖Web浏览器控件的WndProc方法,但在出现提示时不会发送任何消息。

当覆盖整个表单时,我会在出现提示时收到一些消息,但它们与失去焦点而不是实际创建提示有关。所以我能够检测到什么时候创建提示,但仍然无法阻止它的创建。

1 个答案:

答案 0 :(得分:0)

如果您只想关闭除当前窗口之外的任何窗口,您可以在timer_tick事件中使用以下代码:

private void timer1_Tick(object sender, EventArgs e)
{
    for (int i = 0; i < Application.OpenForms.Count; i++)
    {
        Form form = Application.OpenForms[i];
        if (form != this)
        {
            form.Close();
            i--;
        }
    }
}