VB.NETで簡単なWebブラウザを作る
(その4)
現在表示中のWebページから移動するページが、新しいウインドウを作成して表示する場合、新しいウインドウで評するページのURLを引数として別のサンプルプログラムを起動します。
まず、新しいウインドウを開く前に、NewWindow3()イベントの通知を受けるようにします。
NewWindw3()イベントの通知を受けたときに、デフォルトのブラウザで新しいページを開かないようにSystem.ComponentModel.CancelEventArgs(WebBrowserNewWindow3EventArgs)のcancelにTrueをセットして新しいウインドウでページ表示することを禁止します。
ActiveXのNewWindow3()イベントの引数で、新しく開くWebページのURLが取得できるので、別プロセスとして新しいサンプルプログラムを開きます。
サンプルコードを以下に示します。
'****************************************************************************'
'*
'* @brief 新しいウインドウを開くときのイベント処理.
'*
'* @param [in] sender イベントの送信元のオブジェクト.
'* @param [in] e イベント情報.
'*
'* @retval なし.
'*
Private Sub WebBrowser1_NewWindow3(ByVal sender As System.Object, ByVal e As WebBrowserNewWindow3EventArgs) Handles WebBrowser1.NewWindow3
'IEでウインドウを開くのを抑止する.
e.cancel = True
'新しいウインドウを別のサンプルプログラムで開く.
Try
System.Diagnostics.Process.Start("sample_0009.exe", e.bstrUrl)
Catch ex As Exception
MsgBox( ex.Message )
End Try
End Sub
NewWindw3()イベントは、WebBrowserクラスには無いので、ActiveXで発生したNewWindow3イベントを補足する新しいWebBrowserクラスを作成します。
新しく作成するクラスはWebBrowserクラスの派生クラスとします。ActiveXと関連付ける為に、CreateSink()とDetachSinkをオーバーライドします。
ActiveXからのイベント通知をWebBrowserクラスで直接受けられないので、ActiveXからのイベントを受け取るイベント・ハンドラ・クラスを派生したクラス内部に定義します。
また、NewWindw3()イベントで通知されるURL等の引数をアプリケーションに渡す為に、System.ComponentModel.CancelEventArgsから派生したクラスも作成します。
サンプルコードを以下に示します。
'****************************************************************************'
'*
'* @brief NewWindow3()イベントを追加したWebBrowserクラス.
'*
Public Class WebBrowser2
Inherits WebBrowser
Private cookie As AxHost.ConnectionPointCookie
Private helper As WebBrowser2EventHelper
Public Event NewWindow3 As WebBrowserNewWindow3EventHandler
'****************************************************************************'
'*
'* @brief イベント処理クライアントに、ActiveX コントロールをアタッチする.
'*
'* @param なし.
'*
'* @retval なし.
'*
_
Protected Overrides Sub CreateSink()
'派生元クラスのCreateSink()を呼び出す.
MyBase.CreateSink()
'コントロールのイベント処理をActiveXに接続する.
helper = New WebBrowser2EventHelper(Me)
cookie = New AxHost.ConnectionPointCookie(Me.ActiveXInstance, helper, GetType(DWebBrowserEvents2))
End Sub
'****************************************************************************'
'*
'* @brief CreateSink()でアタッチされたイベント処理クライアントを解放する.
'*
'* @param なし.
'*
'* @retval なし.
'*
_
Protected Overrides Sub DetachSink()
'ActiveXに接続されているコントロールのイベント処理を解放する.
If cookie IsNot Nothing Then
cookie.Disconnect()
cookie = Nothing
End If
'派生元クラスのDetachSink()を呼び出す.
MyBase.DetachSink()
End Sub
'****************************************************************************'
'*
'* @brief ActiveXからのNewWindow3()イベントによるコールバック.
'*
'* @param [in] e イベント情報.
'*
'* @retval なし.
'*
Protected Overridable Sub OnNewWindow3(ByVal e As WebBrowserNewWindow3EventArgs)
'アプリケーションに対してNewWindow3()のイベント通知を行う.
RaiseEvent NewWindow3(Me, e)
End Sub
'****************************************************************************'
'*
'* @brief NewWindow3()イベント・ハンドラ・クラス.
'*
Private Class WebBrowser2EventHelper
Inherits StandardOleMarshalObject
Implements DWebBrowserEvents2
Private parent As WebBrowser2
'****************************************************************************'
'*
'* @brief コンストラクタ.
'*
'* @param [in] obj イベント通知先オブジェクト.
'*
'* @retval なし.
'*
Public Sub New(ByVal obj As WebBrowser2)
parent = obj
End Sub
'****************************************************************************'
'*
'* @brief NewWindow3()イベントハンドラ.
'*
'* @param [i/o] ppDisp 現在のウインドウのナビゲーションに使用するWebBrowserオブジェクト(?).
'* @param [i/o] cancel True = デフォルトのブラウザ(IE)で新しいページを開く.
'* @param [in] dwFlags NWMF値(新しいウインドウのポップアップ・ウインドウに関する値).
'* @param [in] bstrUrlContext 現在のウインドウに表示されているページのURL.
'* @param [in] bstrUrl 新しいウインドウに表示するページのURL.
'*
'* @retval なし.
'*
Public Sub NewWindow3(ByRef ppDisp As Object, ByRef cancel As Boolean, ByVal dwFlags As UInt32, _
ByVal bstrUrlContext As String, ByVal bstrUrl As String) Implements DWebBrowserEvents2.NewWindow3
'通知するイベント情報を作成する.
Dim e As New WebBrowserNewWindow3EventArgs(ppDisp, bstrUrlContext, bstrUrl)
'NewWindow3()イベントを通知する.
parent.OnNewWindow3(e)
'アプリケーションからの設定を基本クラス(DWebBrowserEvents2)に反映させる.
ppDisp = e.ppDisp
cancel = e.Cancel
End Sub
End Class
End Class
Public Delegate Sub WebBrowserNewWindow3EventHandler(ByVal sender As Object, ByVal e As WebBrowserNewWindow3EventArgs)
'****************************************************************************'
'*
'* @brief NewWindow3()用のイベント情報クラス.
'*
Public Class WebBrowserNewWindow3EventArgs
Inherits System.ComponentModel.CancelEventArgs
Private ppDispValue As Object
Private bstrUrlContextValue As String
Private bstrUrlValue As String
'****************************************************************************'
'*
'* @brief コンストラクタ.
'*
'* @param [i/o] ppDisp 現在のウインドウのナビゲーションに使用するWebBrowserオブジェクト(?).
'* @param [in] bstrUrlContext 現在のウインドウに表示されているページのURL.
'* @param [in] bstrUrl 新しいウインドウに表示するページのURL.
'*
'* @retval なし.
'*
Public Sub New(ByRef ppDisp As Object, ByVal bstrUrlContext As String, ByVal bstrUrl As String)
ppDispValue = ppDisp
bstrUrlContextValue = bstrUrlContext
bstrUrlValue = bstrUrl
End Sub
'****************************************************************************'
'*
'* @brief ppDispの設定/取得を行う.
'*
Public Property ppDisp() As Object
Get
Return ppDispValue
End Get
Set(ByVal value As Object)
ppDispValue = value
End Set
End Property
'****************************************************************************'
'*
'* @brief 現在のウインドウに表示されているページのURLの設定/取得を行う.
'*
Public Property bstrUrlContext() As String
Get
Return bstrUrlContextValue
End Get
Set(ByVal value As String)
bstrUrlContextValue = value
End Set
End Property
'****************************************************************************'
'*
'* @brief 新しいウインドウに表示するページのURLの設定/取得を行う.
'*
Public Property bstrUrl() As String
Get
Return bstrUrlValue
End Get
Set(ByVal value As String)
bstrUrlValue = value
End Set
End Property
End Class
'****************************************************************************'
'*
'* @brief NewWindow3()のインターフェース定義.
'*
_
Public Interface DWebBrowserEvents2
Sub NewWindow3( _
ByRef pDisp As Object, _
ByRef cancel As Boolean, _
ByVal dwFlags As UInt32, _
ByVal bstrUrlContext As String, _
ByVal bstrUrl As String)
End Interface