ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

FindWindowに「タイムアウトするまで探し続ける機能」欲しい!!!!

うるさい!!!
WinAPIの話です。

FindWindowの問題点

FindWIndowでウィンドウハンドルを取得する際、PCが重かったりするとウィンドウの表示が遅れたりして取得に失敗したりするので、FindWindow()前にSleepするという方法がありますが、これもどれだけSleepすればよいかという問題を抱えており、PCが激重だった場合、Sleepして待っても結局ウィンドウハンドルが取得できないという問題も抱えています。

このような問題はFindWIndowに「タイムアウトするまで探し続ける機能」があればそれで解決する話なので、そのようなラッパー関数を作成しました。できれば標準で欲しかった。

Declare Unicode Function FindWindow Lib "user32.dll" Alias "FindWindowW" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr

Public Function FindWindow2(ByVal cnm As String, ByVal cap As String, Optional ByVal timeout As Integer = 10000) As IntPtr
    ' ウィンドウが見つからない場合、timeoutミリ秒経過するまで無限ループで取得し続ける
    ' タイムアウトしたら0を返す
    ' 関数名はもっと考えよう
    Dim hWnd As IntPtr = 0
    Dim sw As New System.Diagnostics.Stopwatch()
    sw.Start()
    While 1
        System.Windows.Forms.Application.DoEvents()
        hWnd = FindWindow(cnm, cap)
        If hWnd <> 0 Then
            Return hWnd
        End If
        If sw.ElapsedMilliseconds >= timeout Then
            ' タイムアウトした
            Return 0
        End If
        'System.Threading.Thread.Sleep(500)
    End While
    Return hWnd
End Function

CPU使用率が気になる場合は、ループ内で適当な時間Sleepさせれば良いと思います。