C# web浏览器控件-检测何时调用js window.close

C# web浏览器控件-检测何时调用js window.close,c#,.net,winforms,webbrowser-control,C#,.net,Winforms,Webbrowser Control,我已经搜索了好几个小时,但找不到有效的解决方案 我的c#webbrowser控件(winforms应用程序的一部分)在调用js函数关闭窗口时冻结 我可以捕获js window.close事件吗 我找到的最接近的解决方案如下,但它不起作用(编译器不会抛出错误): 方法是: void Window_Unload(object sender, HtmlElementEventArgs e) { MessageBox.Show("Display me when webbrow

我已经搜索了好几个小时,但找不到有效的解决方案

我的c#webbrowser控件(winforms应用程序的一部分)在调用js函数关闭窗口时冻结

我可以捕获js window.close事件吗

我找到的最接近的解决方案如下,但它不起作用(编译器不会抛出错误):

方法是:

    void Window_Unload(object sender, HtmlElementEventArgs e)
    {
      MessageBox.Show("Display me when webbrowser control is disposed");
    }

这只是我的第二个c#程序,也是我第一次自己找不到有效的解决方案。

这实际上取决于您如何处理它,如果您试图处理控件,您可以使用或事件,这是我建议的。

在原始
WebBrowser
ActiveX控件中,它由WinFroms
WebBrowser
控件包装,有一个事件用于此。不幸的是,由于一些我们无法控制的原因


描述了一种可能的解决方法。另一种解决方法是调用
window.close()
时总是触发DOM
window.onunload
。您应该计算出相应的
WebBrowser
状态转换。导航、
窗口之间的转换不同。请关闭
刷新
/F5。更多信息。

WebBrowser控件没有内置检测JavaScript.Close事件的方法。您可以插入自己的JS来帮助处理此问题,也可以扩展WebBrowser控件,以便在启动window.close()并销毁WebBrowser控件时创建事件

从这一页,我得到了以下信息

本例使用VB,但您可以

创建一个新的类文件并将以下代码放入

Public Class MyExtendedBrowserControl
' Based on WebBrowser
Inherits System.Windows.Forms.WebBrowser

' Define constants from winuser.h
Private Const WM_PARENTNOTIFY As Integer = &H210
Private Const WM_DESTROY As Integer = 2

'Define New event to fire
Public Event WBWantsToClose()

Protected Overrides Sub WndProc(ByRef m As Message)
    Select Case m.Msg
        Case WM_PARENTNOTIFY
            If (Not DesignMode) Then
                If (m.WParam = WM_DESTROY) Then
                    ' Tell whoever cares we are closing
                    RaiseEvent WBWantsToClose()
                End If
            End If
            DefWndProc(m)
        Case Else
            MyBase.WndProc(m)
    End Select
End Sub

End Class
现在,您必须将内置的WebControl evocation替换为新的。编辑form1.designer.vb文件或任何调用表单的文件。要执行此操作,请单击解决方案资源管理器中的“显示所有文件”图标以查看设计器文件。打开设计器文件后,用MyExtendedBrowserControl替换System.Windows.Forms.WebBrowser

构建项目。您需要这样做才能编译控件,并使它在窗体本身上显示而不出错


现在您已经构建了项目,您将能够编辑控件并访问新的WBWantsToClose事件。打开表单,单击WebBrowser控件,打开其属性(F4),单击“事件”图标(闪电),双击“WBWANTSTOCLSE”。这将带您进入准备处理事件的代码。

我认为使用“disposed”一词会让问题变得混乱,因为您不是在问.NET Disposition,而是在问webbrowser控件(它是一大块非托管内容的包装器)的某种自我破坏。我同意,我修改了这个问题,使它不那么模棱两可。我的假设可能是错误的,即web浏览器控件正在被处置。如果其他任何人被卡住,此链接将为处理window.close事件的扩展webbrowser类提供一个演示。
Public Class MyExtendedBrowserControl
' Based on WebBrowser
Inherits System.Windows.Forms.WebBrowser

' Define constants from winuser.h
Private Const WM_PARENTNOTIFY As Integer = &H210
Private Const WM_DESTROY As Integer = 2

'Define New event to fire
Public Event WBWantsToClose()

Protected Overrides Sub WndProc(ByRef m As Message)
    Select Case m.Msg
        Case WM_PARENTNOTIFY
            If (Not DesignMode) Then
                If (m.WParam = WM_DESTROY) Then
                    ' Tell whoever cares we are closing
                    RaiseEvent WBWantsToClose()
                End If
            End If
            DefWndProc(m)
        Case Else
            MyBase.WndProc(m)
    End Select
End Sub

End Class