2016-12-01 58 views
3

我有TextBox控件和关联的定时器,它们在每个KeyDownMouseClick事件上重新启动,并在3秒后基于键入的文本执行查询,而无需这些事件。到现在为止还挺好。当TextBox自动完成列表显示时检测

但是,我的一些TextBox中也有用户可以浏览的自动完成列表,但即使他们使用键盘箭头键,计时器也不会停止,并且在用户浏览列表的过程中触发意外的查询。

问题:是否有检测时自动完成列表显示的方式,这样我就可以暂停计时器或忽略了它剔?

非常感谢!

+0

您可以使用['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)方法检查如果窗口是可见的。 –

回答

3

您可以使用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 
+0

它像一个魅力工作。非常感谢你! – VBobCat

+0

不客气:) –

+0

@RezaAghaei偶像+ 1你的答案:) –

相关问题