【问题标题】:web browser control - detect when js window.close is calledWeb浏览器控件-检测何时调用js window.close
【发布时间】:2013-12-10 22:10:17
【问题描述】:

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

当调用 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# 程序,也是我第一次无法自己找到可行的解决方案。

【问题讨论】:

  • 我认为使用“处置”一词会使问题变得混乱,因为您不是在询问 .NET 处置,而是关于 webbrowser 控件的某种自我毁灭(这是一大块非托管东西的包装)
  • 我同意,我已经修改了问题以使其不那么模棱两可。我假设,也许是错误的,Web 浏览器控件正在被处理掉。

标签: c# .net winforms webbrowser-control


【解决方案1】:

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#

新建一个class文件,放入如下代码

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

构建项目。您需要执行此操作才能编译控件并使其在表单本身上无错误地显示。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

    这实际上取决于您如何处置它,您可以使用Component.DisposedControl.HandleDestroyed 事件,如果您尝试处置该控件,我会建议您这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      相关资源
      最近更新 更多