VB6他のプログラムを起動してアイドル状態になるまで待つ

スポンサーリンク

VB6 では、Win32API の WaitForInputIdle 関数を使用します。標準モジュールなどで、以下の Win32API 関数と自作の WaitForInputIdleProcess 関数を定義しておいてください。

サンプルコード

以下にサンプルコードを示します。

VB6.0 以前
Option Explicit

' OpenProcess 関数
Private Declare Function OpenProcess Lib "KERNEL32.DLL" ( _
    ByVal dwDesiredAccess As Long, _
    ByVal bInheritHandle  As Long, _
    ByVal dwProcessId     As Long  _
) As Long

' CloseHandle 関数
Private Declare Function CloseHandle Lib "KERNEL32.DLL" ( _
    ByVal hObject As Long _
) As Long

' WaitForInputIdle 関数
Private Declare Function WaitForInputIdle Lib "USER32.DLL" ( _
    ByVal hProcess       As Long, _
    ByVal dwMilliseconds As Long  _
) As Long

' 定数の定義
Private Const SYNCHRONIZE As Long = &H100000
Private Const INFINITE    As Long = &HFFFF

' -------------------------------------------------------------------------------
'       プロセスがアイドル状態になるまで指定したミリ秒数待機します。
'
' @Param    lProcessId      アイドル状態になるまで待機するプロセスの ID。
' @Param    [lMilliseconds] アイドル状態になるまで待機する時間。(省略時は無限)
' -------------------------------------------------------------------------------
Public Sub WaitForInputIdleProcess(ByVal lProcessId As Long, Optional ByVal lMilliseconds As Long = INFINITE)
    Dim hProcessHandle As Long

    ' Process を開いてハンドルを取得する
    hProcessHandle = OpenProcess(SYNCHRONIZE, 0&, lProcessId)

    If hProcessHandle <> 0 Then
        ' アイドル状態になるまで、指定したミリ秒数待機する
        Call WaitForInputIdle(hProcessHandle, lMilliseconds)

        ' Process のハンドルを閉じる
        Call CloseHandle(hProcessHandle)
    End If
End Sub

使用例は以下のようになります。

VB6.0 以前
    ' プロセス ID を格納するための変数を宣言する
    Dim lProcessId As Long

    ' わざと重いファイルを Notepad で開く
    lProcessId = CLng(Shell("Notepad C:\Hoge.bmp", vbNormalFocus))

    ' アイドル状態になるまで待機する
    Call WaitForInputIdleProcess(lProcessId)

    ' アイドル状態になった旨を表示する
    Call MsgBox("メモ帳がアイドル状態になりました")

関連するリファレンス

準備中です。

スポンサーリンク