Web浏览器控件 - 检测js window.close何时被调用

时间:2013-11-25 23:32:56

标签: c# .net winforms webbrowser-control

我一直在搜索很多小时但找不到合适的解决方案。

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

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

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

HtmlDocument htmlDocument = this.webBrowser1.Document;
htmlDocument.Window.Unload += new HtmlElementEventHandler(Window_Unload);

方法:

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

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

3 个答案:

答案 0 :(得分:0)

在由WinFroms WebBrowser控件包装的原始WebBrowser ActiveX控件中,有WindowClosing事件。不幸的是it doesn't get fired for the WinForms wrapper,由于我们无法控制的某些原因。

描述了一种可能的解决方法here。另一种解决方法依赖于在window.onunload被调用时始终触发DOM window.close()的事实。您应该计算出相应的WebBrowser状态转换。导航,windows.closerefresh / F5 之间的转换不同。更多信息here

答案 1 :(得分:0)

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

从这个页面,我得到了以下信息 http://blogs.msdn.com/b/jpsanders/archive/2007/05/25/how-to-close-the-form-hosting-the-webbrowser-control-when-scripting-calls-window-close-in-the-net-framework-version-2-0.aspx

此示例使用VB,但您可以easily convert it to C#

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

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替换内置的WebControl。编辑form1.designer.vb文件或调用任何表单。为此,请单击"显示所有文件"解决方案资源管理器中的图标以查看设计器文件。打开设计器文件后,将System.Windows.Forms.WebBrowser替换为MyExtendedBrowserControl。

构建项目。您需要为要编译的控件执行此操作,并使其在表单本身上显示没有错误。

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

答案 2 :(得分:-1)

这实际上取决于你如何处理它,你可以使用Component.DisposedControl.HandleDestroyed事件,如果你试图处理控件,我会推荐这个事件。