1

このコードを使用して、特定のウィンドウがアクティブであることを検出し、アクティブであるときは変数にハンドルを保存します。

    Dim kiosk As IntPtr
    Dim l As Integer = GetWindowTextLength(GetForegroundWindow())
    Dim WindowTextBuffer As String = New String(Chr(0), l)
    GetWindowText(GetForegroundWindow(), WindowTextBuffer, l + 1)

    Debug.WriteLine(WindowTextBuffer)


    If WindowTextBuffer = "FFKiosk" Then
        kiosk = GetForegroundWindow()
    End If

これまでのところ、すべてが正常に機能しています。しかし、このウィンドウがまだアクティブであることを確認したいと思います。そうでない場合は、kiosk 変数を null に設定したいと思います。このハンドルがまだ有効かどうかを確認するにはどうすればよいですか?

4

1 に答える 1

1

さて、あなたの特定の質問への答えは次のとおりです:User32.dllからIsWindow関数をインポートします

<DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
Public Shared Function IsWindow(ByVal hWnd As IntPtr) As Boolean
End Function

それから、

If IsWindow(kiosk) Then
    ' do something
End If

ただし、MSDNは、スレッドがウィンドウを作成したスレッドでない場合、次のように警告します。「この関数が呼び出された後にウィンドウが破棄される可能性があるため、スレッドは作成されなかったウィンドウにIsWindowを使用しないでください。さらに、ウィンドウはリサイクルされると、ハンドルが別のウィンドウを指すこともあります。」

代わりに、プロセスIDを取得し、プロセスがまだ実行されているかどうかを確認することをお勧めします。

    Dim processes As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName("theExeName")
    Dim processIds(processes.Length) As Integer

    If processes.Length > 0 Then
        Dim i As Integer = 0
        For Each processId As Integer In processIds
            processIds(i) = processes(i).Id
        Next
于 2013-03-14T13:55:41.080 に答える