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
}