您可以使用EnumThreadWindows 查找所有自动完成下拉窗口并检查它们是否可见。自动完成下拉窗口类名称为Auto-Suggest Dropdown。您可以使用GetClassName 方法获取枚举窗口的类名,然后使用IsWindowVisible 方法检查窗口是否可见。
示例
在下面的示例中,我在问题的代码中使用了一个计时器,在计时器的滴答事件中,我检查了是否打开了一个自动完成窗口,我在标题中显示了“打开”表格,否则显示“关闭”:
Delegate Function EnumThreadDelegate(hWnd As IntPtr, lParam As IntPtr) As Boolean
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Shared Function EnumThreadWindows(dwThreadId As Integer, _
lpfn As EnumThreadDelegate, lParam As IntPtr) As Boolean
End Function
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Shared Function GetClassName(ByVal hWnd As System.IntPtr,
lpClassName As System.Text.StringBuilder, _
nMaxCount As Integer) As Integer
End Function
<System.Runtime.InteropServices.DllImport("kernel32.dll")> _
Shared Function GetCurrentThreadId() As Integer
End Function
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Shared Function IsWindowVisible(hWnd As IntPtr) As Boolean
End Function
Const AutoCompleteClassName As String = "Auto-Suggest Dropdown"
Function EnumThreadCallback(hWnd As IntPtr, lParam As IntPtr) As Boolean
Dim className As New System.Text.StringBuilder("", 256)
GetClassName(hWnd, className, 256)
If className.ToString() = AutoCompleteClassName AndAlso IsWindowVisible(hWnd) Then
AnAutoCOmpleteIsOpen = True
End If
Return True
End Function
Dim AnAutoCOmpleteIsOpen As Boolean = False
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
AnAutoCOmpleteIsOpen = False
EnumThreadWindows(GetCurrentThreadId(), _
New EnumThreadDelegate(AddressOf Me.EnumThreadCallback), IntPtr.Zero)
If (AnAutoCOmpleteIsOpen) Then
Me.Text = "Open"
Else
Me.Text = "Close"
End If
End Sub