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 回答