Code: Select all
List =
(
File1
File6
File5
File2
File4
Folder1
Folder5
Folder6
Folder7
Folder9
)
Loop, parse, List, `n, `r
_List .= (A_Index = 1 ? "" : "|") . A_LoopField
Gui, Add, Combobox, w200, % _List
Gui, Show
OnMessage( 0x111, Func("WM_COMMAND").Bind(CBN_EDITCHANGE := 5, "|" . _List) )
Return
WM_COMMAND(CBN_EDITCHANGE, list, wp, lp) {
static CB_GETCOMBOBOXINFO := 0x0164
, CB_SETMINVISIBLE := 0x1701
, CB_SHOWDROPDOWN := 0x014F
, WM_SETCURSOR := 0x0020
, EM_SETSEL := 0x00B1
, hEdit := 0
if (wp >> 16 != CBN_EDITCHANGE)
Return
hCombo := lp
if !hEdit {
VarSetCapacity(COMBOBOXINFO, size := 40 + A_PtrSize*3)
NumPut(size, COMBOBOXINFO)
SendMessage, CB_GETCOMBOBOXINFO,, &COMBOBOXINFO,, ahk_id %hCombo%
hEdit := NumGet(COMBOBOXINFO, 40 + A_PtrSize)
}
GuiControlGet, text,, %hCombo%
_list := RegExReplace(list, "i)\|(?!\Q" . text . "\E)[^|]+")
GuiControl,, %hCombo%, % _list = "" ? "|" : _list
bool := !(_list = "" || StrLen(text) < 2 || list ~= "i)\|\Q" . text . "\E(\||$)")
SendMessage, CB_SHOWDROPDOWN, bool,,, ahk_id %hCombo%
RegExReplace(_list, "\|", "|", count)
SendMessage, CB_SETMINVISIBLE, count = 0 ? 1 : count > 20 ? 20 : count,,, ahk_id %hCombo%
GuiControl, Text, %hEdit%, % text
SendMessage, EM_SETSEL, -2, -1,, ahk_id %hEdit%
SendMessage, WM_SETCURSOR,,,, ahk_id %hEdit%
}