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
	



Windowsは米国Microsoft Corporationの登録商標です。
Internet Explorerは米国Microsoft Corporationの登録商標です。