ray88’s diary

お仕事で困ったとき用の自分用の覚書

IE操作 取得したIEを最前面に表示する

■取得したIEに対して操作を行う場合、IEが背面にいると操作結果が見られないため、取得したIEを予め最前面に表示させる。
この処理はよく利用する為、再利用できる様、別プロシージャに記述する。

Option Explicit
'強制的に最前面にさせる
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
'最小化されているか調べる
Private Declare PtrSafe Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long
'元の大きさに戻すAPI
Private Declare PtrSafe Function ShowWindowAsync Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long)

'指定されたWindowを最前面にさせる
Sub showForeground(objIE As Object)
    '最小化されている場合は元の大きさに戻す
    '(9=RESTORE:最小化前の状態)
    If IsIconic(objIE.hwnd) Then
        ShowWindowAsync objIE.hwnd, &H9
    End If
    'IEを最前面に表示
    SetForegroundWindow (objIE.hwnd)
End Sub

■解説
SetForegroundWindow関数の引数にはウィンドウのハンドルを指定する。objIEを最前面に表示させたい場合、ハンドルを返すobjIE.hWndプロパティを指定する。

最小化されている場合はSetForeguroundWindow関数のみでは最前面化できず、先に当該ウィンドウを元の大きさに戻して表示させる。その際、Win32APIで、
最小化しているか判定を行えるIsIconic関数、ウィンドウを元の大きさに戻すShowWindowAsync関数を使用する。

■使用例

Sub SearchIE()
    Dim colSh As Object
    Dim win As Object
    Dim strTemp As String
    Dim objIE As Object
    Set colSh = CreateObject("Shell.Application")
    For Each win In colSh.Windows
        strTemp = ""
        On Error Resume Next
        strTemp = win.Document.Title
        On Error GoTo 0
        If InStr(strTemp, "Google") > 0 Then
            Set objIE = win
            Exit For
        End If
    Next
    '取得したIEを最前面に表示する
    Call showForeground(objIE)
End Sub