● Create Process で起動したウインドウのハンドルを取得する ●

Windows95ではウインドウハンドルからプロセスIDを取得する関数は用意されているんだけど、プロセスIDからウインドウハンドルを取得する関数はないんだよね。とりあえず、API関数・定数・外部変数の宣言 & 関数はこのページの通り。これを踏まえて、下のリンク先へ行ってね。
Visual Basic 5.0の場合
Visual Basic 4.0の場合

'新しいプロセスのメインウインドウの表示状態を定義する構造体
Private Type STARTUPINFO
    cb              As Long
    lpReserved    As Long
    lpDesktop      As Long
    lpTitle          As Long
    dwX            As Long
    dwY            As Long
    dwXSize      As Long
    dwYSize      As Long
    dwXCountChars    As Long
    dwYCountChars    As Long
    dwFillAttribute  As Long
    dwFlags          As Long
    wShowWindow    As Integer
    cbReserved2    As Integer
    lpReserved2      As Long
    hStdInput        As Long
    hStdOutput      As Long
    hStdError        As Long
End Type

'新しいプロセスに関する識別情報を定義する構造体
Private Type PROCESS_INFORMATION
    hProcess      As Long
    hThread        As Long
    dwProcessId   As Long
    dwThreadId    As Long
End Type

'プロセスを作成する
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long

Private Const SW_SHOWNORMAL = 1
Private Const STARTF_USESHOWWINDOW = &H1      'ShowWindowを使用する
Private Const STARTF_USESIZE = &H2            'dwXSize、dwYSizeを使用する
Private Const STARTF_USEPOSITION = &H4      'dwX、dwYを使用する
Private Const STARTF_USECOUNTCHARS = &H8  'dwXCountChars、dwYCountCharsを使用する
Private Const STARTF_USEFILLATTRZIBUTE = &H10 'dwFillAttributeを使用する

'プロセスの初期化が終了するまで待機する
Private Declare Function WaitForInputIdle Lib "user32" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long

Private Const INFINITE = &HFFFF

'ハンドルからプロセスIDを取得する
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long

'画面上の全てのトップレベルウインドウを取得する列挙関数
Private Declare Function EnumWindows Lib "user32.dll" (ByVal ipEnumFunc As Long, ByRef lParam As Long) As Long

'トップレベルウインドウを取得する
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'ウインドウのハンドルを取得する
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

'親ウインドウのハンドルを取得する
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

Private Const GW_HWNDFIRST = 0 'トップレベルウインドウ
Private Const GW_HWNDLAST = 1
Private Const GW_HWNDNEXT = 2 '次のウインドウ
Private Const GW_HWNDPREV = 3
Private Const GW_OWNER = 4
Private Const GW_CHILD = 5

'アクティブウインドウのハンドルを取得する
Private Declare Function GetForegroundWindow Lib "user32" () As Long

'外部変数
Private m_Handle As Long    '起動したアプリケーションのハンドル
Private m_ThreadID As Long  '起動したアプリケーションのスレッドID
Private m_ProcessID As Long  '起動したアプリケーションのプロセスID
Private m_hProcess As Long  '起動したアプリケーションのプロセスのハンドル

'---------------------------------------------------------------
'  関数名: ExecuteNotepad
'  機  能: メモ帳を起動する
'  引  数: (in) NotepadDir … メモ帳のフルパス
'  返り値: 正常:True  エラー:False
'  備  考:  特になし
'---------------------------------------------------------------
Private Sub ExecuteNotepad(ByVal NotepadDir As String)

    Dim udtStartupInfo As STARTUPINFO
    Dim udtProcessInfomation As PROCESS_INFORMATION
    Dim ret As Long

    '表示状態を設定する
    With udtStartupInfo
        .cb = Len(udtStartupInfo)
        .dwX = 0     'X座標
        .dwY = 0     'Y座標
        .dwXSize = (Screen.Width \ Screen.TwipsPerPixelX) / 1.8   '幅
        .dwYSize = (Screen.Height \ Screen.TwipsPerPixelY) / 1.8  '高さ
        .dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESIZE Or STARTF_USEPOSITION
        .wShowWindow = SW_SHOWNORMAL
    End With

    'アプリケーション起動
    ret = CreateProcess(NotepadDir, vbNullString, _
                  0&, 0&, _
                  False, 0&, ByVal vbNullString, _
                  vbNullString, udtStartupInfo, udtProcessInfomation)

    With udtProcessInfomation
        m_ProcessID = .dwProcessId 'プロセスID取得
        m_ThreadID = .dwThreadId  'スレッドID取得
        m_hProcess = .hProcess    'プロセスのハンドル取得
    End With

    'プロセスの初期化完了を待つ
    Call WaitForInputIdle(udtProcessInfomation.hProcess, INFINITE)

End Sub

戻る