VBから起動した複数のIEのプロセスをそれぞれ取得するには?


こまったさん  2006-04-07 08:51:21  No: 94957

初めて投稿させていただきます。

メニュー画面に2つのコマンドボタンが有り
1、それぞれのボタンで起動したIE画面の監視を行う。
2、IE画面のツールバーは非表示で起動させる。
3、AAAボタンが押下されたらAAA画面をACTIVEにして最前面に表示、
4、BBBボタンが押下されたらBBB画面をACTIVEにして最前面表示する。
5、メニューのEndボタン押下時に、IE画面AAAとBBBを強制的に終了させる。

上記の様な動きにしたいのですが、IEが2画面でも1プロセスしか
起動しない為、3、4の動作が実現出来ません。

Set objIE = CreateObject("InternetExplorer.application")で、
個々にIEXPLORE.EXEのプロセスを持つ事が可能であれば解決できるんですが、、

1〜5の機能を生かす方法があれば、ご教授願えますでしょうか?

'***************
'
' IE起動  AAA画面
'
'***************
Private Sub cmdAAA_Click()
On Error Resume Next

    Dim lRet            As Long
    Dim hlProcess       As Long
    Dim lwProcessID     As Long
    Dim lpdwExitCode    As Long
    
    Dim objIE           As Object
    
    'AAAブラウザが起動しているか確認
    If glAAA <> 0 Then
        AppActivate glAAA
        Exit Sub
    End If
    
    'IE起動
    Set objIE = CreateObject("InternetExplorer.application")
    
    'URL設定
    objIE.navigate (URL)
    objIE.Visible = True

    'ツールバーが非表示で起動
    objIE.toolbar = False
    glAAAHwnd = objIE.hwnd
    
    'プロセスID取得
    Call GetWindowThreadProcessId(objIE.hwnd, lwProcessID)
    
    'プロセスのオープン
    hlProcess = OpenProcess(PROCESS_QUERY_INFORMATION, True, lwProcessID)
    
    '起動を行なったAAAブラウザのプロセスIDを保持する。
    glAAA = lwProcessID

    Do
        'WINDOWS上にAAA画面が起動しているか常に監視する。
        lRet = GetExitCodeProcess(hlProcess, lpdwExitCode)
        Call Sleep(1000)
        DoEvents
    Loop While lpdwExitCode
    
    '保持したウインドウハンドルクリア
    glAAAHwnd = 0
    '保持したプロセスIDクリア
    glAAA = 0
       
End Sub

'***************
'
' IE起動  BBB画面
'
'***************
Private Sub cmdBBB_Click()
On Error Resume Next

    Dim lRet            As Long
    Dim hlProcess       As Long
    Dim lwProcessID     As Long
    Dim lpdwExitCode    As Long
    
    Dim objIE           As Object
    
    'BBBブラウザが起動しているか確認
    If glBBB <> 0 Then
        AppActivate glBBB 
        Exit Sub
    End If
    
    'IE起動
    Set objIE = CreateObject("InternetExplorer.application")
    
    'URL設定
    objIE.navigate (URL)
    objIE.Visible = True

    'ツールバーが非表示で起動
    objIE.toolbar = False
    glBBBHwnd = objIE.hwnd
    
    'プロセスID取得
    Call GetWindowThreadProcessId(objIE.hwnd, lwProcessID)
    
    'プロセスのオープン
    hlProcess = OpenProcess(PROCESS_QUERY_INFORMATION, True, lwProcessID)
    
    '起動を行なったBBBブラウザのプロセスIDを保持する。
    glBBB = lwProcessID

    Do
        'WINDOWS上にBBB画面が起動しているか常に監視する。
        lRet = GetExitCodeProcess(hlProcess, lpdwExitCode)
        Call Sleep(1000)
        DoEvents
    Loop While lpdwExitCode
    
    '保持したウインドウハンドルクリア
    glBBBHwnd = 0
    '保持したプロセスIDクリア
    glBBB = 0
       
End Sub

Private Sub cmdEND_Click()
On Error Resume Next

    Dim i                       As Integer
    Dim lngMutexHandle          As Long
    Dim cbNeeded                As Long     
    Dim lngProcessHandle        As Long
    Dim lnghModule              As Long
    Dim lngcbNeeded             As Long
    Dim lngProcessID(255)       As Long
    Dim lngWin32apiResultCode   As Long
    Dim strExeFileNameBuffer    As String * 516
    Dim strModuleName           As String
    Dim lngApiRet As Long

    lngApiRet = EnumProcesses(lngProcessID(0), UBound(lngProcessID), cbNeeded)
    For i = 0 To (cbNeeded / 4) - 1
        'プロセスのハンドルを取得
        lngProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, 0&, lngProcessID(i))
        If lngProcessHandle Then
           ' 実行可能モジュール名を取得
            If GetModuleBaseName(lngProcessHandle, 0, strExeFileNameBuffer, Len(strExeFileNameBuffer)) <> 0 Then
                
               '実行可能モジュール名を切り出し
               strModuleName = Left(strExeFileNameBuffer, InStr(strExeFileNameBuffer, vbNullChar) - 1)

         If Trim$(UCase(strModuleName)) = "XXXXXX.EXE" Or lngProcessID(i) = glAAA Or lngProcessID(i) = glBBB Then
               
                      'VBの別FORMの強制終了処理
                        If TerminateProcess(lngProcessHandle, 0) <> 0 Then
                            Call CloseHandle(lngProcessHandle)
                        End If

           'AAA画面を強制終了する
          If glAAAHwnd <> 0 Then
              Call SendMessageByNum(glAAAHwnd, WM_SYSCOMMAND, SC_CLOSE, 0)
          End If
                        
           'BBB画面を強制終了する
           If glBBBHwnd <> 0 Then
              Call SendMessageByNum(glBBBHwnd, WM_SYSCOMMAND, SC_CLOSE, 0)
           End If
     End If
      End If
        End If
        Call CloseHandle(lngProcessHandle)
    Loop

End Sub


魔界の仮面弁士  2006-04-07 10:58:19  No: 94958

> 1、それぞれのボタンで起動したIE画面の監視を行う。
『監視』とは、具体的にはどのような事でしょうか?

とりあえず、ユーザー操作などによる終了を捕らえたい、という意味で
あれば、OnQuitイベントを使う事ができますけれども。

> 2、IE画面のツールバーは非表示で起動させる。
ToolBar プロパティ。
お気に入りや履歴などのバーも消すなら、ShowBrowserBarメソッド。

> 3、AAAボタンが押下されたらAAA画面をACTIVEにして最前面に表示、
> 4、BBBボタンが押下されたらBBB画面をACTIVEにして最前面表示する。
AAA画面、BBB画面というのが良く分かりませんが、アクティブにするのは
AppActivate とか SetForegroundWindow APIとか。
最前面表示に関しては HWND_TOPMOST とか。

> 5、メニューのEndボタン押下時に、IE画面AAAとBBBを強制的に終了させる。
Quitメソッド。


K.J.K.  2006-04-07 18:09:34  No: 94959

AAA及びBBBをInternetExplorer型のイベント付きオブジェクトとして
変数に保管しておけば、対応はできますよね。

プロセスのハンドルが同じでも、ウィンドウのハンドルは異なる
でしょうし、オブジェクトも異なるでしょうし。


こまったさん  2006-04-07 18:27:40  No: 94960

魔界の仮面弁士様
K.J.K.様
回答ありがとうございます。

参考にして試してみますので、
のちほど結果を報告させていただきます。


こまったさん  2006-04-07 18:27:40  No: 94961

魔界の仮面弁士様
K.J.K.様
回答ありがとうございます。

参考にして試してみますので、
のちほど結果を報告させていただきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加