none
WebBrowser の動作とExcelのツールバーについて RRS feed

  • 質問

  • WebBrowser の動作とExcelのツールバーについて教えてください。

     

    IE のクライアント領域に Excel のBookファイルをDropしますと、

    Excel のツールバーの全種類が IE の表示メニューから表示可能になりますが、

    WebBrowser に D&D した場合にもこれと同様の対処が可能でしょうか?

     

    VB6時代にあった WebBrowser では、ExcelのBookファイルを D&Dすると自動的に

    ツールバーが表示されていましたが、現在その機能がなく、実現するとすれば上記

    IE と同様な、アプリケーション側でのメニューによって対応する必要があるようでした。

     

    Excel のメニューやツールバーといった情報をWebBrowserからの情報で知り

    それを IE と同様にして表示し利用することは可能でしょうか?もし可能な場合、

    その方法についてご教示いただければありがたいです。

     

    何卒よろしくお願い致します。

     

    2007年9月21日 1:31

回答

  • VB.NET2003では簡単に実現できましたが,VB2005のWebBrowserコントロールでは難しいようです。

    WebBrowserコントロールを継承して,DocumentCompleteイベントを拡張する必要があると思います。

    一応以下のコードでツールバーの表示に成功しましたが,もっと簡単な方法があるかもしれません。

    参考にしてください。

     

    以下のコードはVB2005のフォームに貼り付けて実行できます。

    事項したらD&DでExcelのファイルを落としてください。

     

    Code Snippet

    Imports System.Runtime.InteropServices
    Imports System.Security.Permissions

    Public Class Form1

        Dim WithEvents WebBrowser As New ExWebBrowser

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.WebBrowser.Dock = DockStyle.Fill
            Me.Controls.Add(Me.WebBrowser)
        End Sub

        Private Sub WebBrowser_DocumentComplete(ByVal sender As Object, ByVal e As WebBrowserDocumentCompleteEventArgs) Handles WebBrowser.DocumentComplete
            Dim doc As Object = e.pDisp.document
            doc.CommandBars("Standard").Visible = True
            doc.CommandBars("Formatting").Visible = True
        End Sub

    End Class

    Public Class ExWebBrowser
        Inherits WebBrowser

        Private cookie As AxHost.ConnectionPointCookie
        Private helper As WebBrowser2EventHelper

        <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 DocumentComplete As WebBrowserDocumentCompleteEventHandler

        Protected Overridable Sub OnDocumentComplete( _
        ByVal e As WebBrowserDocumentCompleteEventArgs)
            RaiseEvent DocumentComplete(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 DocumentComplete(ByVal pDisp As Object, ByRef URL As Object) _
            Implements DWebBrowserEvents2.DocumentComplete
                Me.parent.OnDocumentComplete( _
                New WebBrowserDocumentCompleteEventArgs(pDisp, CStr(URL)))
            End Sub

        End Class

    End Class

    Public Delegate Sub WebBrowserDocumentCompleteEventHandler(ByVal sender As Object, ByVal e As WebBrowserDocumentCompleteEventArgs)

    Public Class WebBrowserDocumentCompleteEventArgs
        Inherits EventArgs

        Private pDispValue As Object
        Private UrlValue As String

        Public Sub New(ByVal pDisp As Object, ByVal Url As String)
            Me.pDispValue = pDisp
            Me.UrlValue = Url
        End Sub

        Public Property pDisp() As Object
            Get
                Return pDispValue
            End Get
            Set(ByVal value As Object)
                pDispValue = value
            End Set
        End Property

        Public Property Url() As String
            Get
                Return UrlValue
            End Get
            Set(ByVal value As String)
                UrlValue = value
            End Set
        End Property

    End Class

    <ComImport(), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), _
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch), _
    TypeLibType(TypeLibTypeFlags.FHidden)> _
    Public Interface DWebBrowserEvents2

        <DispId(259)> Sub DocumentComplete( _
            <InAttribute(), MarshalAs(UnmanagedType.IDispatch)> ByVal pDisp As Object, _
            <InAttribute()> ByRef URL As Object)

    End Interface

     

    2007年9月23日 15:08

すべての返信

  • VB.NET2003では簡単に実現できましたが,VB2005のWebBrowserコントロールでは難しいようです。

    WebBrowserコントロールを継承して,DocumentCompleteイベントを拡張する必要があると思います。

    一応以下のコードでツールバーの表示に成功しましたが,もっと簡単な方法があるかもしれません。

    参考にしてください。

     

    以下のコードはVB2005のフォームに貼り付けて実行できます。

    事項したらD&DでExcelのファイルを落としてください。

     

    Code Snippet

    Imports System.Runtime.InteropServices
    Imports System.Security.Permissions

    Public Class Form1

        Dim WithEvents WebBrowser As New ExWebBrowser

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.WebBrowser.Dock = DockStyle.Fill
            Me.Controls.Add(Me.WebBrowser)
        End Sub

        Private Sub WebBrowser_DocumentComplete(ByVal sender As Object, ByVal e As WebBrowserDocumentCompleteEventArgs) Handles WebBrowser.DocumentComplete
            Dim doc As Object = e.pDisp.document
            doc.CommandBars("Standard").Visible = True
            doc.CommandBars("Formatting").Visible = True
        End Sub

    End Class

    Public Class ExWebBrowser
        Inherits WebBrowser

        Private cookie As AxHost.ConnectionPointCookie
        Private helper As WebBrowser2EventHelper

        <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 DocumentComplete As WebBrowserDocumentCompleteEventHandler

        Protected Overridable Sub OnDocumentComplete( _
        ByVal e As WebBrowserDocumentCompleteEventArgs)
            RaiseEvent DocumentComplete(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 DocumentComplete(ByVal pDisp As Object, ByRef URL As Object) _
            Implements DWebBrowserEvents2.DocumentComplete
                Me.parent.OnDocumentComplete( _
                New WebBrowserDocumentCompleteEventArgs(pDisp, CStr(URL)))
            End Sub

        End Class

    End Class

    Public Delegate Sub WebBrowserDocumentCompleteEventHandler(ByVal sender As Object, ByVal e As WebBrowserDocumentCompleteEventArgs)

    Public Class WebBrowserDocumentCompleteEventArgs
        Inherits EventArgs

        Private pDispValue As Object
        Private UrlValue As String

        Public Sub New(ByVal pDisp As Object, ByVal Url As String)
            Me.pDispValue = pDisp
            Me.UrlValue = Url
        End Sub

        Public Property pDisp() As Object
            Get
                Return pDispValue
            End Get
            Set(ByVal value As Object)
                pDispValue = value
            End Set
        End Property

        Public Property Url() As String
            Get
                Return UrlValue
            End Get
            Set(ByVal value As String)
                UrlValue = value
            End Set
        End Property

    End Class

    <ComImport(), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), _
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch), _
    TypeLibType(TypeLibTypeFlags.FHidden)> _
    Public Interface DWebBrowserEvents2

        <DispId(259)> Sub DocumentComplete( _
            <InAttribute(), MarshalAs(UnmanagedType.IDispatch)> ByVal pDisp As Object, _
            <InAttribute()> ByRef URL As Object)

    End Interface

     

    2007年9月23日 15:08
  • YAS.s 様

     

    すごいです、、このご指導戴いたコードをさっそく試してみましたところ、みごとに Excel のツールバーが表示され動作も正しく行われることが確認できました。大変ありがとうございました!!

     

    一時はネット上に出ていましたCom 機能を利用するためのインプレースアクティベーションといったことをやらなければならないのかと気が遠くなりかけていました。この教えていただきました方法ですと、WebBrowser の拡張によって可能になっていましたので実にスマートな解決法と関心致しました。

     

    私には、このプログラムに使われているWebBrowser の深い機能と StandardOleMarshalObject などの技術をこれから一つ一つ学ぶ必要がありましたが、この機能を利用することができる幸いに感謝します!

     

    そこで本技術に関して、次2点につきご指導を賜ればありがたく存じます。

     

    A. この中の、拡張された WebBrowserDocumentCompleteEventArgs クラスの要素 pDispValue As Object について、pDispValueオブジェクト の厳密な型、またはクラスについて (Option Strict On で遅延バインディング不可への対応)

     

    B. Excel におきましてユーザーがチェックマークを入れることで必要なツールバーの種類を選択可能な選択ボックスなどのオブジェクトなどもこの拡張されたExWebBrowserクラスによって可能かどうか、可能な場合、どのような追加コードが必要か

     

    これらにつきご指導並びにこれらの技術の使用、学習にあたってのアドバイス等戴ければ大変ありがたく存じます。

     

    ご指導に感謝します!!

     

    2007年9月25日 1:21