● VB4.0の場合 ●

VB4.0はコールバック関数が使えないので自力実装が必要。

'---------------------------------------------------------------
' 関数名: gHandleVB4
' 機  能: プロセスIDからハンドルを取得する
' 引  数: なし
' 返り値: 正常:ハンドル  エラー:0
'---------------------------------------------------------------
Property Get gHandleVB4() As Long
    gHandleVB4 = GetHandleFromProcessID_VB4(m_ProcessID)
End Property

'---------------------------------------------------------------
' 関数名: GetHandleFromProcessID_VB4
' 機  能: プロセスIDからハンドルを取得する
' 引  数: (in) ProcessID … プロセスID
' 返り値: 正常:プロセスIDをもつウインドウハンドル  エラー:0
'---------------------------------------------------------------
Private Function GetHandleFromProcessID_VB4(ByVal ProcessID As Long) As Long

    Dim ret As Long

    'プロセスIDが0であればエラー
    If ProcessID = 0 Then
        Exit Function
    Else
        'ハンドルを取得する
        Call EnumWindowsProcVB4(ProcessID)
    End If

    GetHandleFromProcessID_VB4 = m_Handle

  End Function

'---------------------------------------------------------------
' 関数名: EnumWindowsProcVB4
' 機  能: 起動したアプリケーションのハンドルを取得する
' 引  数: (in) pID … プロセスID
' 返り値: なし
'---------------------------------------------------------------
Private Sub EnumWindowsProcVB4(ByVal pID As Long)

    Dim ghWnd As Long    'GetWindowより取得したハンドル
    Dim gThreadID As Long  'スレッドID
    Dim gProcessID As Long 'プロセスID

    'トップレベルウインドウのハンドルを取得する
    'ghWnd= GetWindow(GetForegroundWindow, GW_HWNDFIRST) 'これでもよい
    ghWnd = FindWindow(vbNullString, vbNullString)

    Do
        'ハンドルからプロセスIDを取得する
        gThreadID = GetWindowThreadProcessId(ghWnd, gProcessID)

        '調査開始、プロセスIDとスレッドIDを調査する
        '親ウインドウを持たない(=自分自身が親ウインドウ)

        If GetParent(ghWnd) = 0 Then
            If gThreadID = m_ThreadID Then
                If gProcessID = m_ProcessID Then
                    m_Handle = ghWnd  'ハンドル取得
                    Exit Do
                End If
            End If
        End If

        '次のハンドルの取得
        ghWnd = GetWindow(ghWnd, GW_HWNDNEXT)
    Loop While ghWnd <> 0

End Sub

戻る