YAS's VB2005Tips
VB2005のWebBrowserコントロールにNewWindow2イベントを拡張する
- VB2005のWebBrowserコントロールにはNewWindow2イベントがない。そのため新規ウィンドウ表示をキャンセルすることはできても,Webページをロードするオブジェクトを指定することはできない。
- WebBrowser.CreateSinkメソッドのヘルプのサンプルを参考にDWebBrowserEvents2のNewWindow2のイベントを実装した。
- 以下のサンプルはWebBrowserコントロールにNewWindow2イベントを拡張し,新規ウィンドウ表示を新規タブに表示するようにする。
Imports System.Runtime.InteropServices
Imports System.Security.Permissions
Public Class Form1
Dim TabControl1 As New TabControl
Dim WebBrowser1 As ExWebBrowser
Dim TabPage1 As TabPage
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.WebBrowser1 = New ExWebBrowser
Me.WebBrowser1.Dock = DockStyle.Fill
AddHandler WebBrowser1.NewWindow2, AddressOf WebBrowser_NewWindow2
Me.TabPage1 = New TabPage
Me.TabPage1.Controls.Add(WebBrowser1)
Me.TabControl1.Dock = DockStyle.Fill
Me.TabControl1.TabPages.Add(TabPage1)
Me.Text = "WebBrowserNewWindow2Event"
Me.Controls.Add(Me.TabControl1)
Me.WebBrowser1.GoHome()
End Sub
Private Sub WebBrowser_NewWindow2(ByVal sender As Object, ByVal e As WebBrowserNewWindow2EventArgs)
Me.WebBrowser1 = New ExWebBrowser
Me.WebBrowser1.Dock = DockStyle.Fill
AddHandler WebBrowser1.NewWindow2, AddressOf WebBrowser_NewWindow2
Me.TabPage1 = New TabPage
Me.TabPage1.Controls.Add(WebBrowser1)
Me.TabControl1.Controls.Add(TabPage1)
Me.TabControl1.SelectedTab = TabPage1
e.ppDisp = Me.WebBrowser1.Application
Me.WebBrowser1.RegisterAsBrowser = True
End Sub
End Class
Class ExWebBrowser
Inherits WebBrowser
Private cookie As AxHost.ConnectionPointCookie
Private helper As WebBrowser2EventHelper
<System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)> _
<System.Runtime.InteropServices.DispIdAttribute(200)> _
Public ReadOnly Property Application() As Object
Get
If IsNothing(Me.ActiveXInstance) Then
Throw New AxHost.InvalidActiveXStateException("Application", AxHost.ActiveXInvokeKind.PropertyGet)
End If
Return Me.ActiveXInstance.Application
End Get
End Property
<System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)> _
<System.Runtime.InteropServices.DispIdAttribute(552)> _
Public Property RegisterAsBrowser() As Boolean
Get
If IsNothing(Me.ActiveXInstance) Then
Throw New AxHost.InvalidActiveXStateException("RegisterAsBrowser", AxHost.ActiveXInvokeKind.PropertyGet)
End If
Return Me.ActiveXInstance.RegisterAsBrowser
End Get
Set(ByVal value As Boolean)
If IsNothing(Me.ActiveXInstance) Then
Throw New AxHost.InvalidActiveXStateException("RegisterAsBrowser", AxHost.ActiveXInvokeKind.PropertySet)
End If
Me.ActiveXInstance.RegisterAsBrowser = value
End Set
End Property
<PermissionSetAttribute(SecurityAction.LinkDemand, Name:="FullTrust")> _
Protected Overrides Sub CreateSink()
MyBase.CreateSink()
helper = New WebBrowser2EventHelper(Me)
cookie = New AxHost.ConnectionPointCookie(Me.ActiveXInstance, helper, GetType(DWebBrowserEvents2))
End Sub
<PermissionSetAttribute(SecurityAction.LinkDemand, Name:="FullTrust")> _
Protected Overrides Sub DetachSink()
If cookie IsNot Nothing Then
cookie.Disconnect()
cookie = Nothing
End If
MyBase.DetachSink()
End Sub
Public Event NewWindow2 As WebBrowserNewWindow2EventHandler
Protected Overridable Sub OnNewWindow2(ByVal e As WebBrowserNewWindow2EventArgs)
RaiseEvent NewWindow2(Me, e)
End Sub
Private Class WebBrowser2EventHelper
Inherits StandardOleMarshalObject
Implements DWebBrowserEvents2
Private parent As ExWebBrowser
Public Sub New(ByVal parent As ExWebBrowser)
Me.parent = parent
End Sub
Public Sub NewWindow2(ByRef ppDisp As Object, ByRef cancel As Boolean) Implements DWebBrowserEvents2.NewWindow2
Dim e As New WebBrowserNewWindow2EventArgs(ppDisp)
Me.parent.OnNewWindow2(e)
ppDisp = e.ppDisp
cancel = e.Cancel
End Sub
End Class
End Class
Public Delegate Sub WebBrowserNewWindow2EventHandler(ByVal sender As Object, ByVal e As WebBrowserNewWindow2EventArgs)
Public Class WebBrowserNewWindow2EventArgs
Inherits System.ComponentModel.CancelEventArgs
Private ppDispValue As Object
Public Sub New(ByVal ppDisp As Object)
Me.ppDispValue = ppDisp
End Sub
Public Property ppDisp() As Object
Get
Return ppDispValue
End Get
Set(ByVal value As Object)
ppDispValue = value
End Set
End Property
End Class
<ComImport(), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), _
InterfaceType(ComInterfaceType.InterfaceIsIDispatch), _
TypeLibType(TypeLibTypeFlags.FHidden)> _
Public Interface DWebBrowserEvents2
<DispId(DISPID.NEWWINDOW2)> Sub NewWindow2( _
<InAttribute(), OutAttribute(), MarshalAs(UnmanagedType.IDispatch)> ByRef ppDisp As Object, _
<InAttribute(), OutAttribute()> ByRef cancel As Boolean)
End Interface
Public Enum DISPID
NEWWINDOW2 = 251
End Enum
参考情報
ダウンロード