Le code (un peu bricolé) vient tout droit du forum US. C'est un peu tordu parce qu'il n'utilise pas une combo mais une gui popup avec une liste
[si la quantité de données est très importante il vaudrait probablement mieux passer par une base de données]
Code : Tout sélectionner
; http://www.autoitscript.com/forum/topic/158070-autocomplete-input-text/
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <ListBoxConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <File.au3>
#include <Array.au3>
$csv = "Parisot,Nombre d'habitants1,code postal1" & @crlf & _
	"Paris,Nombre d'habitants2,code postal2" & @crlf & _
	"Parennes,Nombre d'habitants3,code postal3"
If not FileExists("test.csv") Then FileWrite("test.csv", $csv)
Global $array_csv
_FileReadToArray("test.csv", $array_csv, 0, ",")
;_ArrayDisplay($array_csv)
Global $villes[UBound($array_csv)] 
For $i = 0 to UBound($array_csv)-1
   $villes[$i] = $array_csv[$i][0]
Next
;_ArrayDisplay($villes)
Global $hList, $idCurInput, $sCurrInput = "", $hListGUI = -1
$hGUI = GUICreate("AutoComplete Input Text", 300, 150)
GUICtrlCreateLabel('ville', 10, 10, 280, 20)
$hInput = GUICtrlCreateInput("", 10, 30, 280, 20)
GUICtrlCreateLabel('informations', 10, 70, 280, 20)
$hInput2 = GUICtrlCreateInput("", 10, 90, 130, 20)
$hInput3 = GUICtrlCreateInput("", 150, 90, 130, 20)
GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
        ExitLoop
  EndSwitch
WEnd
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
   #forceref $hWnd, $Msg, $lParam
    Local $IdFrom = BitAnd($wParam, 0x0000FFFF)
    Local $iCode = BitShift($wParam, 16)
    Switch $IdFrom
       Case $hInput
          Switch $iCode
            Case $EN_UPDATE
               $idCurInput = $IdFrom
                _Update($idCurInput)
          EndSwitch
       Case $hList
         _Update($idCurInput)
    EndSwitch
   Return $GUI_RUNDEFMSG
EndFunc
Func _Update($_input)
    If GUICtrlRead($_Input) <> $sCurrInput Then 
        $sCurrInput = GUICtrlRead($_Input)
        If $hListGUI <> -1 Then ; List is visible.
             GUIDelete($hListGUI)
             $hListGUI = -1
        EndIf
        If GUICtrlRead($hInput) = "" Then 
           GuiCtrlSetData($hInput2, "")
           GuiCtrlSetData($hInput3, "")
        EndIf
        $hList = _PopupSelector($hGUI, $hListGUI, $_Input, _CheckInputText($_Input, $villes)) 
; optionnel
        If $hList = -1 Then 
            GuiCtrlSetData($_Input, "")
            $sCurrInput = GUICtrlRead($_Input)
        EndIf
    EndIf
; ------
    Local $sChosen
    If $hList <> -1 Then $sChosen = GUICtrlRead($hList)
    If $sChosen <> "" Then
        GuiCtrlSetData($_Input, $sChosen)
        For $i = 0 to UBound($villes)-1
             If $sChosen = $villes[$i] Then 
                 GuiCtrlSetData($hInput2, $array_csv[$i][1])
                 GuiCtrlSetData($hInput3, $array_csv[$i][2])
             EndIf
        Next
        $sCurrInput = GUICtrlRead($_Input)
        GUIDelete($hListGUI)
        $hListGUI = -1
    EndIf
EndFunc  ;==>_Update
Func _PopupSelector($hMainGUI, ByRef $hListGUI, $_Input, $sCurr_List)
    Local $hList = -1
    If $sCurr_List = "" Then Return $hList
    Local $pos = ControlGetPos($hMainGUI, "", $_Input)
    $hListGUI = GUICreate("", 280, 160, $pos[0], $pos[1]+$pos[3], $WS_POPUP, _ 
		BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_MDICHILD), $hMainGUI)
    $hList = GUICtrlCreateList("", 0, 0, 280, 150, BitOR(0x00100000, 0x00200000))
    GUICtrlSetData($hList, $sCurr_List)
    StringReplace($sCurr_List, "|", "|")
    Local $iCurrHeight = @extended * GUICtrlSendMsg($hList, $LB_GETITEMHEIGHT, 0, 0) + 10
    WinMove($hListGUI, "", Default, Default, Default, $iCurrHeight)
    GUICtrlSetPos($hList, 0, 0, 150, $iCurrHeight)
    GUISetControlsVisible($hListGUI) ; To Make Control Visible And Window Invisible.
    GUISetState(@SW_SHOWNOACTIVATE, $hListGUI)
    Return $hList
EndFunc   ;==>_PopupSelector
Func _CheckInputText($_Input, $array)
   Local $sPartialData = ""
   Local $aSelected = _GetSelectionPointers($_Input)
    If (IsArray($aSelected)) And ($aSelected[0] <= $aSelected[1]) Then
        $sCurrInput = GUICtrlRead($_Input)
        Local $aSplit = StringSplit(StringLeft($sCurrInput, $aSelected[0]), " ")
        $aSelected[0] -= StringLen($aSplit[$aSplit[0]])
        If $aSplit[$aSplit[0]] <> "" Then
            For $A = 0 To UBound($array)-1
                If StringLeft($array[$A], StringLen($aSplit[$aSplit[0]])) = $aSplit[$aSplit[0]] _ 
				And $array[$A] <> $aSplit[$aSplit[0]] Then
                    $sPartialData &= $array[$A] & "|"
                EndIf
            Next
        EndIf
    EndIf
    Return $sPartialData
EndFunc   ;==>_CheckInputText
Func _GetSelectionPointers($hEdit)
    Local $aReturn[2] = [0, 0]
    Local $aSelected = GUICtrlRecvMsg($hEdit, 0x00B0) ; $EM_GETSEL.
    If IsArray($aSelected) Then
        $aReturn[0] = $aSelected[0]
        $aReturn[1] = $aSelected[1]
    EndIf
    Return $aReturn
EndFunc   ;==>_GetSelectionPointers
Func GUISetControlsVisible($hWnd) ; By Melba23.
    Local $aControlGetPos = 0, $hCreateRect = 0, $hRectRgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    Local $iLastControlID = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle(-1))
    For $i = 3 To $iLastControlID
        $aControlGetPos = ControlGetPos($hWnd, '', $i)
        If IsArray($aControlGetPos) = 0 Then ContinueLoop
        $hCreateRect = _WinAPI_CreateRectRgn($aControlGetPos[0], $aControlGetPos[1], _ 
			$aControlGetPos[0] + $aControlGetPos[2], $aControlGetPos[1] + $aControlGetPos[3])
        _WinAPI_CombineRgn($hRectRgn, $hCreateRect, $hRectRgn, 2)
        _WinAPI_DeleteObject($hCreateRect)
    Next
    _WinAPI_SetWindowRgn($hWnd, $hRectRgn, True)
    _WinAPI_DeleteObject($hRectRgn)
EndFunc   ;==>GUISetControlsVisible