.net - 检测文本框自动完成列表何时显示

标签 .net vb.net winforms autocomplete textbox

我有 TextBox 控件和关联的计时器,它们在每次 KeyDownMouseClick 事件时重新启动,并在 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

关于.net - 检测文本框自动完成列表何时显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40912233/

相关文章:

c# - for循环的优化

excel - SQL WHERE BETWEEN 未选择所有数据

.net - .Net 中奇怪的随机数错误

c# - FormBorderStyle.None 去除windows 8原生打开效果

c# - ASP 登录控件 - 检查登录状态

c# - 带有 C# Windows 窗体应用程序的 Oracle 即时客户端

vb.net - 如何转换整数?到VB.NET中的整数?

string - 删除字符串的内容 - TextBox 的行为与 DataGridView 文本单元格略有不同

javascript - 在 Windows 窗体中单击 CefSharp 浏览器中的按钮

c# - 使用 Simple Java Runner 的具有多个模块的 Sonar C# 项目