Prendendo spunto da un blog mi sono 'divertito' con l'API SHAutoComplete.
Che cosa fa esattamente?: Avete presente quando digitate un indirizzo all'interno della barra di IE e 'magicamente' vi si apre una lista con tutti gli indirizzi appena visitati? ecco, questa funzione e' attivata attraverso l'API sopra citata.
Per renderla piu' utilizzabile ho wrappato il tutto in una classe la quale ha un metodo Add con 3 overloads in modo da poter attivare l'automplete solo per textBox, comboBox oppure tutte le combo e textBox presenti in un Form
Per le funzionalita' dell'enumerato richiesto dalla Add vi rimando a questo link

Esempio d'uso:

AutoSuggest sugg=
new AutoSuggest();
sugg.Add(
this,AutoSuggest.AutoCompleteFlags.UrlAll);

Codice:

public class AutoSuggest
{
[Flags]
public enum AutoCompleteFlags :
uint
{
Default = 0x00000000,
FileSystem = 0x00000001,
UrlAll = (UrlHistory | UrlMRU),
UrlHistory = 0x00000002,
UrlMRU = 0x00000004,
UseTab = 0x00000008,
FileSys_Only = 0x00000010,
FileSys_Dirs = 0x00000020,
AutoSuggest_Force_On = 0x10000000,
AutoSuggest_Force_Off = 0x20000000,
AutoAppend_Force_On = 0x40000000,
AutoAppend_Force_Off = 0x80000000
}
#region
Win32API
[DllImport("shlwapi.dll")]
private static extern
Int32 SHAutoComplete(IntPtr hwndEdit,AutoCompleteFlags dwFlags);
[DllImport("user32.dll")]
private static extern
IntPtr GetWindow(IntPtr hwnd,Int32 Cmd);
[DllImport("ole32.dll")]
private static extern
Int32 CoInitialize ([ MarshalAs( UnmanagedType.AsAny )] Object o);
private const
Int32 GW_CHILD = 5;
#endregion

public AutoSuggest()
{
Int32 ret=CoInitialize(
null
);
if(ret!=0 && ret!=1) throw new
Win32Exception();
}

public void Add(TextBox source, AutoCompleteFlags mode)
{
if (source!=null
) pAdd (source.Handle,mode);
}

public void Add(ComboBox source, AutoCompleteFlags mode)
{
IntPtr childHWnd=GetWindow(source.Handle,GW_CHILD);
if
(childHWnd!=IntPtr.Zero) pAdd (childHWnd,mode);
}

public void Add (Form containerForm,AutoCompleteFlags mode)
{
 foreach(Control ctr in
containerForm.Controls)
{
if (ctr is TextBox) this
.Add((TextBox) ctr,mode);
if (ctr is ComboBox) this
.Add((ComboBox)ctr,mode);
}
}

#region Private Routines
private void
pAdd(IntPtr handle, AutoCompleteFlags mode)
{
if(SHAutoComplete(handle,mode)!=0) throw (new
Win32Exception());
}
#endregion
}