tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: withEventsで生成したInternetExplorerが捕捉できない
投稿日: 2015/04/12(Sun) 04:24
投稿者魔界の仮面弁士
やりたい事が理解できているか自信が無いですが、こういうことで良いのかな。

IE の OnQuit イベントの受信は、クラスモジュール CBrowser で行わせています。
で、それをコレクションで束ねた物を、ShellWindows 代わりに使うという寸法です。

OnQuit されたことを自作コレクションに伝えるイベント管理クラスは、面倒なので省略。
イベント通知するかわりに、Form1 自身のメソッドをコールバックすることで代用しています。
複数フォームを持つアプリの場合は、管理クラスも作った方が良いでしょうね。


※当方には Win7 + VB6 な環境が無いので未チェックです。

'==== クラスモジュール「CBrowser」
Option Explicit

Public Owner As Form1
Private WithEvents IE As InternetExplorer

Private Sub Class_Initialize()
    Set IE = New InternetExplorer
    IE.Visible = True
End Sub

Public Property Get Browser() As InternetExplorer
    Set Browser = IE
End Property

Private Sub Class_Terminate()
    Set Owner = Nothing
    IE.Quit     'アプリ終了時にIEを閉じたくないなら「Set IE = Nothing」
End Sub

Private Sub IE_OnQuit()
    'IEが終了したら、管理クラス(この場合はForm1)に通知する
    If Not Owner Is Nothing Then
        Call Owner.OnIEQuit(IE)
    End If
    Set IE = Nothing
End Sub


'==== フォーム「Form1」
'Command1 と List1 を貼り、List1 には URL を並べておく
Option Explicit

Private mCols As Collection     '起動されたIE群を管理するコレクション
Private Declare Function ShowWindow Lib "User32" (ByVal HWND As OLE_HANDLE, ByVal nCmdShow As Long) As Long
Private Declare Function CloseWindow Lib "User32" (ByVal HWND As OLE_HANDLE) As Long

Private Sub Form_Initialize()
    Set mCols = New Collection
End Sub

Private Sub Command1_Click()
    Const SW_SHOWMAXIMIZED = 3&
    
    Dim strURL As String
    strURL = List1.Text

    Dim oBrowser As CBrowser
    For Each oBrowser In mCols
        If InStr(oBrowser.Browser.LocationURL, strURL) <> 0 Then
            'すでに開いているURLなら最大化する
            '(アクティブ化のコードは用意しなくて良いのかな?)
            Call ShowWindow(oBrowser.Browser.HWND, SW_SHOWMAXIMIZED)
            Exit Sub
        End If
    Next
    'まだ開いてないページなら新規に開く(ただし最小化で)
    Call OpenIE(strURL)
End Sub

'自作クラス CBrowser からの終了通知を受け取るためのコールバック
Friend Sub OnIEQuit(ByVal sender As InternetExplorer)
    Dim n As Long
    For n = 1 To mCols.Count
        If mCols(n).Browser Is sender Then
            '終了したIEをコレクションから取り除く
            Call mCols.Remove(n)
            Exit For
        End If
    Next
End Sub

'IEを起動し、コレクションで管理する
Public Sub OpenIE(ByVal strURL As String)
    Dim oBrowser As CBrowser
    Set oBrowser = New CBrowser
    Set oBrowser.Owner = Me      'コールバック先のクラス
    Call mCols.Add(oBrowser)     '自作コレクションに追加
    Call CloseWindow(IE.HWND)    '最小化
    Call oBrowser.Browser.Navigate2(strURL)
End Sub

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。