我一直在搜索很多小时但找不到合适的解决方案。
当调用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#程序,也是我第一次无法找到自己的解决方案。
答案 0 :(得分:0)
在由WinFroms WebBrowser
控件包装的原始WebBrowser
ActiveX控件中,有WindowClosing
事件。不幸的是it doesn't get fired for the WinForms wrapper,由于我们无法控制的某些原因。
描述了一种可能的解决方法here。另一种解决方法依赖于在window.onunload
被调用时始终触发DOM window.close()
的事实。您应该计算出相应的WebBrowser
状态转换。导航,windows.close
和refresh
/ F5 之间的转换不同。更多信息here。
答案 1 :(得分:0)
WebBrowser控件没有内置方法来检测JavaScript.Close事件。您可以注入自己的JS来帮助您处理此问题,或者您可以扩展WebBrowser控件以在触发window.close()并销毁WebBroser控件时创建事件。
此示例使用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.Disposed
或Control.HandleDestroyed
事件,如果你试图处理控件,我会推荐这个事件。