C# web浏览器控件-检测何时调用js window.close
我已经搜索了好几个小时,但找不到有效的解决方案 我的c#webbrowser控件(winforms应用程序的一部分)在调用js函数关闭窗口时冻结 我可以捕获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
void Window_Unload(object sender, HtmlElementEventArgs e)
{
MessageBox.Show("Display me when webbrowser control is disposed");
}
这只是我的第二个c#程序,也是我第一次自己找不到有效的解决方案。这实际上取决于您如何处理它,如果您试图处理控件,您可以使用或事件,这是我建议的。在原始
WebBrowser
ActiveX控件中,它由WinFromsWebBrowser
控件包装,有一个事件用于此。不幸的是,由于一些我们无法控制的原因
描述了一种可能的解决方法。另一种解决方法是调用
window.close()
时总是触发DOMwindow.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