Author:水如烟
新窗口的处理。
因为我是尽量利用原来的类来扩展功能的,自己也不清楚IE的运行机制,所以,实现的功能可能缺陷多多。
新窗口的打开,有以下两种情形:
一是网页代码本身设置了的,二是鼠标右击时选择了“在新窗口打开”菜单。
实现打开新窗口,技术关键有三处:
一是取得新窗口所需的地址;
二是捕获了打开新窗口的事件;
三是程序本身需用参数启动新线程。
下面分别说明一下。
取地址:
以下代码在
Namespace LzmTW.uSystem.uWindows.uForm.Web
Public Class WebBrowser
定义属性,
''New Window
Private gNewWindowUri As Uri = New Uri("about:blank")
Public ReadOnly Property NewWindowUri() As Uri
Get
Return gNewWindowUri
End Get
End Property
取地址,
Protected Overrides Sub OnNewWindow(ByVal e As System.ComponentModel.CancelEventArgs)
Dim mElement As HtmlElement = Me.Document.ActiveElement
Dim mHref As String = mElement.GetAttribute("href")
If Not String.IsNullOrEmpty(mHref) Then
gNewWindowUri = New Uri(mHref)
End If
MyBase.OnNewWindow(e)
End Sub
ActiveElement并不能保证含有新窗口的地址,优快云 社区首页的链接就不行。
所以,还要走下偏门:
Protected Overrides Sub OnStatusTextChanged(ByVal e As System.EventArgs)
Dim tmpUri As Uri
Try
tmpUri = New Uri(Me.StatusText)
gNewWindowUri = New Uri(Me.StatusText)
Catch ex As UriFormatException
End Try
MyBase.OnStatusTextChanged(e)
End Sub
当鼠标滑过链接节点时,StatusText会捕获到这个地址。它也不总是反映这个地址,上面保留的是最后的有效地址。
两种方法结合起来,好象可以应付过去。
捕获新窗口事件:
这个简单些,在应用程序界面代码里,
Private Sub WebBrowser1_NewWindow(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) _
Handles WebBrowser1.NewWindow
e.Cancel = True
Process.Start(Application.ExecutablePath, Me.WebBrowser1.NewWindowUri.AbsoluteUri)
End Sub
开一个接受地址的方法:
Public Sub Navigate(ByVal uri As String)
Me.WebBrowser1.Navigate(uri)
End Sub
用Main()方法接受参数:
Public Class Program
<STAThread()> _
Shared Sub Main(ByVal args As String())
Dim ArgArray As String() = System.Environment.GetCommandLineArgs
Dim AppForm As New ExplorerForm
If ArgArray.Length > 1 Then
AppForm.Navigate(ArgArray(1))
End If
Application.Run(AppForm)
End Sub
End Class
现在就提供代码下载吧,也不知道什么时候做完它。
代码下载