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

C# 如何检测winforms应用程序何时创建新窗口?,c#,winforms,webbrowser-control,C#,Winforms,Webbrowser Control,我在表单应用程序中使用webbrowser控件,我想阻止它可以创建的任何弹出/警报/提示窗口 目前,我正在实施各种方法来阻止弹出窗口,如: 取消创建新窗口时触发的各种事件 通过注册表更改全局IE设置以减少显示 警报和提示 使用浏览器功能控件阻止某些弹出窗口 将javascript注入每个页面以禁用可以创建新窗口的功能 通过实现IDocHostShowUI之类的东西,使用新事件扩展web浏览器控件 阻止某些弹出窗口 使用基本activeX webbrowser对象(如NewWindow2和New

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

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

  • 取消创建新窗口时触发的各种事件
  • 通过注册表更改全局IE设置以减少显示 警报和提示
  • 使用浏览器功能控件阻止某些弹出窗口
  • 将javascript注入每个页面以禁用可以创建新窗口的功能
  • 通过实现IDocHostShowUI之类的东西,使用新事件扩展web浏览器控件 阻止某些弹出窗口
  • 使用基本activeX webbrowser对象(如NewWindow2和NewWindow3)的“隐藏”事件
所有这些组合在一起阻止了webbrowser控件可以创建的所有窗口的99%(1%是一些极为罕见的情况,例如从iframe中调用的javascript prompt()函数,该文档位于与父窗口不同的域中,但仍然没有找到阻止该窗口的方法:D)

但是它的代码太多了,弄得一团糟,有时会干扰正常的浏览。 我想知道是否有不同的方法。由于webbrowser控件创建的大多数窗口实际上都是由我的应用程序的进程创建的,有没有办法检测我的应用程序何时创建任何类型的非主窗体窗口并立即关闭它或完全阻止它的创建

更新:

我已尝试覆盖webbrowser控件的WndProc方法,但出现提示时不会发送任何消息


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

如果您只想关闭除当前窗口外的任何窗口,可以在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--;
        }
    }
}
private void timer1\u勾选(对象发送方,事件参数e)
{
for(int i=0;i
如果您只想关闭除当前窗口外的任何窗口,可以在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--;
        }
    }
}
private void timer1\u勾选(对象发送方,事件参数e)
{
for(int i=0;i
我已经有一段时间没有这样做了,所以我不回答。但是google WndProc、窗口子类化、SetWindowHookEx、SetWindowLong等等。。您需要将web浏览器WndProc回调重写为您自己制作的回调,在该回调中,您可以截取来自web浏览器控件的消息并让它们通过或阻止它们。或者,您可以废弃web浏览器控件并使用CEF(Chrome Embedded Framework),并且可能具有更好的功能@Ryios我已经尝试覆盖web浏览器的WndProc方法,但是在创建提示时我没有收到任何消息。嗯,那可能不可能。您可能希望将CEF作为替代方案。这是可能的,但是你需要做的是钩子CreateWindow,这很复杂。你需要使用c/c++来做。我已经有一段时间没有做过这些了,所以我不回答。但是google WndProc、窗口子类化、SetWindowHookEx、SetWindowLong等等。。您需要将web浏览器WndProc回调重写为您自己制作的回调,在该回调中,您可以截取来自web浏览器控件的消息并让它们通过或阻止它们。或者,您可以废弃web浏览器控件并使用CEF(Chrome Embedded Framework),并且可能具有更好的功能@Ryios我已经尝试覆盖web浏览器的WndProc方法,但是在创建提示时我没有收到任何消息。嗯,那可能不可能。您可能希望将CEF作为替代方案。这是可能的,但是你需要做的是钩子CreateWindow,这很复杂。您需要使用c/c++来完成此操作。它只关闭窗体窗口,而不关闭其他类型的窗口,如对话框。如果存在可以检测所有类型窗口的类似窗口,那就太好了。我搜索了一点,但不幸的是我找不到关闭模式对话框的方法。它只关闭窗体窗口,而不关闭其他类型的窗口,如对话框。如果存在类似的东西,可以检测所有类型的窗口,那就太好了。我搜索了一点,但不幸的是,我找不到关闭模式对话框的方法。