我有TextBox
控件和关联的定时器,它们在每个KeyDown
或MouseClick
事件上重新启动,并在3秒后基于键入的文本执行查询,而无需这些事件。到现在为止还挺好。当TextBox自动完成列表显示时检测
但是,我的一些TextBox中也有用户可以浏览的自动完成列表,但即使他们使用键盘箭头键,计时器也不会停止,并且在用户浏览列表的过程中触发意外的查询。
问题:是否有检测时自动完成列表显示的方式,这样我就可以暂停计时器或忽略了它剔?
非常感谢!
我有TextBox
控件和关联的定时器,它们在每个KeyDown
或MouseClick
事件上重新启动,并在3秒后基于键入的文本执行查询,而无需这些事件。到现在为止还挺好。当TextBox自动完成列表显示时检测
但是,我的一些TextBox中也有用户可以浏览的自动完成列表,但即使他们使用键盘箭头键,计时器也不会停止,并且在用户浏览列表的过程中触发意外的查询。
问题:是否有检测时自动完成列表显示的方式,这样我就可以暂停计时器或忽略了它剔?
非常感谢!
您可以使用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
您可以使用['EnumThreadWindows'](https://msdn.microsoft.com/en -us/library/windows/desktop/ms633495(v = vs.85).aspx)来查找所有自动完成的下拉窗口并检查它们中的任何一个是否可见。自动完成下拉窗口类名是'Auto-Suggest Dropdown'。您可以使用['GetClassName'(https://msdn.microsoft.com/en-us/library/windows/desktop/ms633582(V = vs.85)的.aspx)方法获得枚举窗口的类名,然后使用['IsWindowVisible'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms633530(v = vs.85)的.aspx)方法检查如果窗口是可见的。 –