如何检测winforms应用程序何时创建了一个新窗口

本文关键字:一个 新窗口 窗口 何时 何检测 检测 winforms 应用程序 创建 | 更新日期: 2023-09-27 18:15:16

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

目前,我正在实现各种方法来阻止弹出,如:

  • 取消创建新窗口时触发的各种事件。
  • 通过注册表更改全局IE设置,使其显示更少
  • 使用浏览器功能控件来阻止一些弹出窗口。
  • 在每个页面中注入javascript来禁用可以创建新窗口的函数。
  • 通过实现像IDocHostShowUI这样的东西来扩展带有新事件的web浏览器控件阻止某些弹出窗口
  • 使用"hidden"事件的基本activeX web浏览器对象,如NewWindow2和NewWindow3。

所有这些组合阻止了99%的窗口,web浏览器控件可以创建(1%是一些极其罕见的情况,如javascript prompt()函数从iframe内调用,该文档位于与父窗口不同的域,仍然没有找到阻止它的方法:D)。

但是它有很多代码,使它变得一团糟,有时会干扰正常的浏览。我想知道是否有不同的方法。由于大多数由浏览器控件创建的窗口实际上是由我的应用程序的进程创建的,是否有一种方法来检测当我的应用程序创建任何类型的窗口,而不是主要形式,并立即关闭它或阻止它的创建完全?

更新:

我已经尝试重写webbrowser控件的WndProc方法,但是当提示出现时没有发送消息。

当为整个表单重写它时,当提示出现时,我确实会得到一些消息,但它们与失去焦点有关,而不是与提示的实际创建有关。因此,我能够检测何时创建提示符,但仍然无法阻止它的创建。

如何检测winforms应用程序何时创建了一个新窗口

如果您只想关闭除当前窗口之外的任何窗口,您可以在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--;
        }
    }
}