VB6代码可能大家都很熟悉了,不过为了便于对照,还是贴上来,这部分是转帖,转自 http://support.microsoft.com/kb/185538/zh-cn
Option Explicit
Dim WithEvents Web_V1 As SHDocVwCtl.WebBrowser_V1
Private Sub Form_Load()
Set Web_V1 = WebBrowser1.Object
WebBrowser1.Navigate2 http://www.163.com/
End Sub
Private Sub Web_V1_NewWindow(ByVal URL As String, _
ByVal Flags As Long, _
ByVal TargetFrameName As String, _
PostData As Variant, _
ByVal Headers As String, _
Processed As Boolean)
Processed = True
WebBrowser1.Navigate URL
End Sub
天呢,怎么粘贴之后的代码自动去掉换行了。。。。。。。。
【注意】不论使用一下哪个代码,都不要添加system32/shdocvw.dll引用(COM)。
根据这个代码,在VB.NET中以前采取了这样的做法:
'方法1,使用AxWebBroeser
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AxWebBrowser1.Size = New Size(306, 344)
End Sub
Dim WithEvents V1_Test1 As SHDocVw.WebBrowser_V1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
V1_Test1 = AxWebBrowser1.GetOcx
AxWebBrowser1.Navigate2("http://www.163.com/")
End Sub
Private Sub V1_Test_NewWindow(ByVal URL As String, ByVal Flags As Integer, ByVal TargetFrameName As String, ByRef PostData As Object, ByVal Headers As String, ByRef Processed As Boolean) Handles V1_Test1.NewWindow
If MsgBox("正在打开新窗口: " & URL & " 是否继续?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
If MsgBox("是否在本程序窗口中打开新页面而不在IE中打开?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then Processed = True
AxWebBrowser1.Navigate2(URL)
Else
Processed = True
End If
End Sub
这种方法你可以测试一下,从而理解Processed 参数的意义:取消新窗口打开——同时也取消了导航,利用这一点,上面代码实现了允许/禁止打开弹出页,控制弹出页在本程序打开还是其他程序打开,下面的方法2是一样的思路。
这种方法完全是VB6代码的“忠实”升级,效果还是不错的,但是,需要用AxWebBrowser可现在大家都用.NET自带的WebBrowser写程序了,总不能为了这一功能就“倒退”回去吧。中午研究了一下,实际上,我们可以非常简单的实现:
我们想个办法获取WebBrowser_V1接口就可以了,什么办法呢?使用ActiveXInstance方法:
'方法2,使用WebBrowser
Dim V1_Test2 As SHDocVw.WebBrowser_V1
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
WebBrowser1.Navigate("http://www.163.com")
V1_Test2 = TryCast(Me.WebBrowser1.ActiveXInstance, SHDocVw.WebBrowser_V1)
AddHandler V1_Test2.NewWindow, AddressOf V1_Test2_NewWindow
End Sub
Private Sub V1_Test2_NewWindow(ByVal URL As String, ByVal Flags As Integer, ByVal TargetFrameName As String, ByRef PostData As Object, ByVal Headers As String, ByRef Processed As Boolean)
If MsgBox("正在打开新窗口: " & URL & " 是否继续?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
If MsgBox("是否在本程序窗口中打开新页面而不在IE中打开?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then Processed = True
WebBrowser1.Navigate(URL)
Else
Processed = True
End If
End Sub
这里的代码和上面的形式是完全一样的,仅仅是获取接口的形式不一样,至于AddHandler,大家一看就明白了,呵呵,只是用来代替声明时WithEvents语句而已,实际上没什么区别。
最后一个需要说明的地方,我用的VB2008……AxWebBrowser这个小鬼子在的窗口设计器里面自己改变大小,所以
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AxWebBrowser1.Size = New Size(306, 344)
End Sub
。。。。。。。。。
行了,写到这里,回家睡觉,晚上还要上班的