arnoldgh
asked on
SHAutoComplete API control for ComboBox
I am able to run this API and get all the URL's in my History and pass it all to my ComboBox, this is actually my objective. It should have been ok but my problem is that, the Keypress Event is disabled or in other words, the Enter Key becomes disabled. My question is how am I going to pass the control back to the ComboBox again so that it functions as normal. Thank you very much. The codes are as follows.
'Ignore registry default and force feature on
Public Const SHACF_AUTOSUGGEST_FORCE_ON As Long = &H10000000
'Ignore registry default and force feature off.
Public Const SHACF_AUTOSUGGEST_FORCE_OF F As Long = &H20000000
'Ignore registry default and force feature on. (Also know as AutoComplete)
Public Const SHACF_AUTOAPPEND_FORCE_ON As Long = &H40000000
'Ignore registry default and force feature off. (Also know as AutoComplete)
Public Const SHACF_AUTOAPPEND_FORCE_OFF As Long = &H80000000
'Currently (SHACF_FILESYSTEM | SHACF_URLALL)
Public Const SHACF_DEFAULT As Long = &H0
'Includes the File System as well as the rest
'of the shell (Desktop\My Computer\Control Panel\)
Public Const SHACF_FILESYSTEM As Long = &H1
'URLs in the User's History
Public Const SHACF_URLHISTORY As Long = &H2
'URLs in the User's Recently Used list
Public Const SHACF_URLMRU As Long = &H4
Public Const SHACF_URLALL As Long = (SHACF_URLHISTORY Or SHACF_URLMRU)
'Identifies the platform for which the DLL was built.
Public Const DLLVER_PLATFORM_WINDOWS As Long = &H1 'Windows 95
Public Const DLLVER_PLATFORM_NT As Long = &H2 'Windows NT
Public Type COMBOBOXINFO
cbSize As Long
rcItem As RECT
rcButton As RECT
stateButton As Long
hwndCombo As Long
hwndEdit As Long
hwndList As Long
End Type
Public Type DllVersionInfo
cbSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformID As Long
End Type
Public Declare Function DllGetVersion Lib "shlwapi" _
(dwVersion As DllVersionInfo) As Long
Public Function GetComboEditHandle(ctl As ComboBox) As Long
Dim CBI As COMBOBOXINFO
CBI.cbSize = Len(CBI)
Call GetComboBoxInfo(ctl.hwnd, CBI)
GetComboEditHandle = CBI.hwndEdit
End Function
Public Declare Function GetComboBoxInfo Lib "user32" _
(ByVal hwndCombo As Long, _
CBInfo As COMBOBOXINFO) As Long
Public Declare Function SHAutoComplete Lib "shlwapi" _
(ByVal hwndEdit As Long, _
ByVal dwFlags As Long) As Long
' This is the function that I use to call all the APIs
' to retrieve all the URLs in my History.
Public Function AutoLoadCombo()
Dim DVI As DllVersionInfo
Dim hedit1 As Long, hedit2 As Long
If GetIEVersion(DVI) >= 5 Then
'Turn on auto-complete
hedit1 = GetComboEditHandle(cboURL1 )
Call SHAutoComplete(hedit1, SHACF_DEFAULT)
End If
End Function
'Ignore registry default and force feature on
Public Const SHACF_AUTOSUGGEST_FORCE_ON
'Ignore registry default and force feature off.
Public Const SHACF_AUTOSUGGEST_FORCE_OF
'Ignore registry default and force feature on. (Also know as AutoComplete)
Public Const SHACF_AUTOAPPEND_FORCE_ON As Long = &H40000000
'Ignore registry default and force feature off. (Also know as AutoComplete)
Public Const SHACF_AUTOAPPEND_FORCE_OFF
'Currently (SHACF_FILESYSTEM | SHACF_URLALL)
Public Const SHACF_DEFAULT As Long = &H0
'Includes the File System as well as the rest
'of the shell (Desktop\My Computer\Control Panel\)
Public Const SHACF_FILESYSTEM As Long = &H1
'URLs in the User's History
Public Const SHACF_URLHISTORY As Long = &H2
'URLs in the User's Recently Used list
Public Const SHACF_URLMRU As Long = &H4
Public Const SHACF_URLALL As Long = (SHACF_URLHISTORY Or SHACF_URLMRU)
'Identifies the platform for which the DLL was built.
Public Const DLLVER_PLATFORM_WINDOWS As Long = &H1 'Windows 95
Public Const DLLVER_PLATFORM_NT As Long = &H2 'Windows NT
Public Type COMBOBOXINFO
cbSize As Long
rcItem As RECT
rcButton As RECT
stateButton As Long
hwndCombo As Long
hwndEdit As Long
hwndList As Long
End Type
Public Type DllVersionInfo
cbSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformID As Long
End Type
Public Declare Function DllGetVersion Lib "shlwapi" _
(dwVersion As DllVersionInfo) As Long
Public Function GetComboEditHandle(ctl As ComboBox) As Long
Dim CBI As COMBOBOXINFO
CBI.cbSize = Len(CBI)
Call GetComboBoxInfo(ctl.hwnd, CBI)
GetComboEditHandle = CBI.hwndEdit
End Function
Public Declare Function GetComboBoxInfo Lib "user32" _
(ByVal hwndCombo As Long, _
CBInfo As COMBOBOXINFO) As Long
Public Declare Function SHAutoComplete Lib "shlwapi" _
(ByVal hwndEdit As Long, _
ByVal dwFlags As Long) As Long
' This is the function that I use to call all the APIs
' to retrieve all the URLs in my History.
Public Function AutoLoadCombo()
Dim DVI As DllVersionInfo
Dim hedit1 As Long, hedit2 As Long
If GetIEVersion(DVI) >= 5 Then
'Turn on auto-complete
hedit1 = GetComboEditHandle(cboURL1
Call SHAutoComplete(hedit1, SHACF_DEFAULT)
End If
End Function
ASKER
Hi Richie,
I would like to thank you for your time and effort for finding solution to my problem. Your suggestion is very good which is a short version of what my code is, however, it is not exactly what I want.
After trying some other methods, I have already found the answer. For those who might have encoutered the same problem as I had. I would suggest to use the following code. In this way, although the "Keypress" event does not recognise the "Enter" key, the "Keydown" event will surely catch it.
Private Sub cboURL1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
ctlWeb1.Navigate cboURL1.Text, Null, Null, Null, Null
End If
End Sub
Thank you,
Arnold
I would like to seek advise from the moderator as to how am I going to give some point to Richie for his suggestion which I believe some experts will find it useful.
I would like to thank you for your time and effort for finding solution to my problem. Your suggestion is very good which is a short version of what my code is, however, it is not exactly what I want.
After trying some other methods, I have already found the answer. For those who might have encoutered the same problem as I had. I would suggest to use the following code. In this way, although the "Keypress" event does not recognise the "Enter" key, the "Keydown" event will surely catch it.
Private Sub cboURL1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
ctlWeb1.Navigate cboURL1.Text, Null, Null, Null, Null
End If
End Sub
Thank you,
Arnold
I would like to seek advise from the moderator as to how am I going to give some point to Richie for his suggestion which I believe some experts will find it useful.
Glad to see you got it work!
Cheers
Cheers
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
http://www.freevbcode.com/ShowCode.Asp?ID=2266
http://www.vbcodemagician.dk/tips/internet_autocomplete.htm