我的vb表单上有一个浏览器控件,实现NewWindow2事件以捕获新窗口请求并将其发送到我的表单的另一个实例,根据这篇MS文章:How To Use the WebBrowser Control NewWindow2 Event
当新表单以非模态显示时,这工作正常。但是当窗体以模态显示时,浏览器控件不会加载。
代码示例:创建一个新项目,向表单添加一个命令按钮和浏览器控件。添加以下代码。
Private Sub Command1_Click()
WebBrowser1.Navigate2 "www.microsoft.com"
End Sub
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
Dim ofrm As Form1
Set ofrm = New Form1
ofrm.WebBrowser1.RegisterAsBrowser = True
Set ppDisp = ofrm.WebBrowser1.Object
ofrm.Show 'vbModal
End Sub
运行项目,单击命令按钮,将显示该网站。按住Shift键并单击一个超链接(或右键单击并选择“在新窗口中打开”),将加载一个新的Form1实例,并显示单击的超链接网站。
但是在未注释“vbmodal”的情况下运行,并且在显示新的Form1之后,浏览器控件未加载新网站。
如何让这个以新模式显示为模态?
由于
修改
我自己的错! NewWindow2事件需要在新浏览器窗口能够显示站点内容之前完成。由于在事件处理程序中显示表单模式将无法在卸载表单之前完成事件处理程序,当然浏览器控件保持为空!
根据Noseratio的建议,要求执行基本上异步的模态表单显示。在VB6-land中,使用计时器可以轻松完成。
对于上面的代码示例,还要向表单添加一个计时器控件,确保它最初未启用,然后使用以下代码:
Private Sub Command1_Click()
WebBrowser1.Navigate2 "www.microsoft.com"
End Sub
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
Dim ofrm As Form1
Set ofrm = New Form1
ofrm.WebBrowser1.RegisterAsBrowser = True
Set ppDisp = ofrm.WebBrowser1.Object
Timer1.Interval = 50
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Timer1.Enabled = False
ofrm.Show vbModal
End Sub
答案 0 :(得分:0)
尝试异步显示表单:
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
Dim ofrm As Form1
Set ofrm = New Form1
ofrm.WebBrowser1.RegisterAsBrowser = True
Set ppDisp = ofrm.WebBrowser1.Object
Private Sub goModal()
ofrm.Show vbModal
End Sub
SynchronizationContext.Current.Post(AddressOf goModal, Nothing)
End Sub