Option Explicit
'API sendmessage to listbox
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long
Const LB_FINDSTRING = &H18F
Dim delKey As Boolean
Dim boolClick As Boolean
Private Sub Form_Load()
With List1
.AddItem "one"
.AddItem "two"
.AddItem "three"
.AddItem "four"
.AddItem "five"
.AddItem "six"
.AddItem "seven"
.AddItem "eight"
.AddItem "nine"
.AddItem "ten"
End With
End Sub
Private Sub List1_Click()
'to prevent executing the click event
If boolClick Then Exit Sub
Text1.Text = List1.Text
End Sub
Private Sub List1_GotFocus()
SendKeys "{DOWN}"
End Sub
Private Sub List1_KeyDown(KeyCode As Integer, Shift As Integer)
List1_Click
End Sub
Private Sub Text1_Change()
'autocomplete feature
Dim strt As Long
boolClick = True
'Retrieve the item's listindex
List1.ListIndex = SendMessage(List1.hwnd, LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
If Not delKey Then
If List1.ListIndex <> -1 Then
strt = Len(Text1.Text)
Text1.Text = List1.List(List1.ListIndex)
Text1.SelStart = strt
Text1.SelLength = Len(Text1.Text) - strt
End If
End If
delKey = False
boolClick = False
End Sub
Private Sub Text1_Click()
'select all the text
Text1.SelStart = 0
Text1.SelLength = Len(Text1)
End Sub
Private Sub text1_KeyDown(KeyCode As Integer, Shift As Integer)
'for delete and backspace
If KeyCode = vbKeyDelete Or KeyCode = 8 Then
delKey = True
Exit Sub
ElseIf KeyCode = vbKeyDown Then
List1.SetFocus
ElseIf KeyCode = vbKeyUp Then
List1.SetFocus
SendKeys "{UP 2}"
End If
End Sub