It's more of a proof of concept implementation. I haven't used it long enough to see if it's really useful, but I post the script anyway if anyone's interested.
It can be activated with F3 if a standard Open/Save dialog is active. There is a short description of the other keys in the script.
I tested it only on Win2K, I don't know if XP's dialogs are different.
; ; File finder for file open/close dialogs ; ; ; The file finder can be activated when a standard file open/close ; dialog is displayed. It allows quick selection of a path with ; file completion. ; ; Keys: ; ; Tab - Completes the current path if possible or shows ; a completion list if there are more than one matches ; Ctrl+Backspace ; - removes the last directory component from the path ; Enter - sends the selected path to the dialog ; Esc - cancels the finder window ; ; ;---------------------------------------------------------------------- AutoTrim, off ; maximum number of entries shown when there are more than one ; matching entries displaylimit = 25 ;---------------------------------------------------------------------- ; ; Global variables: ; ; gui_id - id of the GUI window ; prev_filepath - the previously completed path or empty if there ; were no previous completion ; sortedmatches - array containing the sorted match list ; continueat - index in sortedmatches where the completion ; display continues if TAB is pressed again ; ;---------------------------------------------------------------------- $f3:: IfWinNotActive, ahk_class #32770 { Send, {f3} return } gosub getcurrentdir wingetpos, x, y, width, height, a x += 20 y += 50 editor_width = %width% editor_width -= 20 Gui, Add, Edit, x10 y10 w%editor_width% vfilepath, %dir% Gui, Add, Text, x15 y40 w%editor_width%, Press TAB for file completion Gui, Show, x%x% y%y% h60 w%width%, File Finder WinGet, gui_id, ID, A send, {end} settimer, closeifinactive, 200 hotkey, enter, choosepath hotkey, enter, on hotkey, tab, completion hotkey, tab, on hotkey, ^backspace, deletedirectory hotkey, ^backspace, on enterpressed = prev_filepath = return ;---------------------------------------------------------------------- ; ; Determine the current directory ; ; Return: dir - the current directory or blank if it cannot be determined ; getcurrentdir: ctrl = ComboBox1 controlgettext, currentitem, %ctrl%, A controlget, list, list,, %ctrl%, A numitems = 0 loop, parse, list, `n { items%a_index% = %a_loopfield% numitems += 1 } index = %numitems% loop, %numitems% { stringtrimleft, item, items%index%, 0 if item = %currentitem% break index -= 1 } if index = 0 return ; current item not found if index = 1 return ; the first item cannot be a directory dir = currentindex = %index% loop, %currentindex% { stringtrimleft, item, items%index%, 0 ; check if it's a drive letter stringright, end, item, 2 if end = :) { stringright, item, item, 3 stringleft, item, item, 2 dir = %item%\%dir% break } dir = %item%\%dir% index -= 1 } ; cannot determine current directory if index = 0 dir = return ;---------------------------------------------------------------------- ; ; Show a message to the user ; ; Parameters: msg - the message text ; showmessage: guicontrol,, Static1, %msg% return ;---------------------------------------------------------------------- ; ; Show a path in the editbox ; ; Parameters: arg - the path to be shown ; showpath: guicontrol,, Edit1, %arg% send, {end} return ;---------------------------------------------------------------------- ; ; Try completing the current file name ; completion: guicontrolget, filepath,, Edit1 if prev_filepath = %filepath% if prev_filepath <> { gosub, shownextpage return } prev_filepath = ; split the path into directory name and file name stringgetpos, pos, filepath, \, r1 if ErrorLevel = 1 { msg = Can't complete path gosub, showmessage return } stringleft, dir, filepath, %pos% pos += 1 stringtrimleft, file, filepath, %pos% ; check if the directory part actually exists filegetattrib, attrib, %dir% if ErrorLevel = 1 { msg = Directory does not exist: %dir% gosub, showmessage return } ; enumerate files in directory numfiles = 0 loop, %dir%\*, 1 { numfiles += 1 files%numfiles% = %A_LoopFileName% } ; if file name part is empty check if directory is empty if file = if numfiles = 0 { msg = Empty directory gosub, showmessage return } ; show the possible completions msg = gosub, showmessage stringlen, filename_len, file nummatches = 0 loop, %numfiles% { stringtrimleft, item, files%a_index%, 0 stringleft, beginning, item, %filename_len% if beginning = %file% { nummatches += 1 matches%nummatches% = %item% } } if nummatches = 0 { msg = No completions found for file name: %file% gosub, showmessage tooltip return } if nummatches = 1 { stringtrimleft, item, matches%nummatches%, 0 stringlen, item_len, item filepath = %dir%\%item% filegetattrib, attrib, %filepath% ifinstring, attrib, D { arg = %filepath%\ gosub, showpath } else { if filename_len = %item_len% { msg = Sole completion gosub, showmessage } else { arg = %filepath% gosub, showpath } } tooltip return } ; check if some characters can be completed stringlen, filename_len, file completion = %filename_len% quit = loop { search = match = yes loop, %nummatches% { stringtrimleft, item, matches%a_index%, 0 if search = { stringlen, item_len, item if completion = %item_len% { ; no more characters can be completed quit = yes break } completion += 1 stringleft, search, item, %completion% } else { stringleft, beginning, item, %completion% if beginning <> %search% { ; no match match = break } } } if quit = yes break if match <> yes { completion -= 1 break } } ; if some characters can be completed then add them to the path if completion > %filename_len% { stringleft, complstr, matches1, %completion% arg = %dir%\%complstr% gosub, showpath tooltip return } ; show the completion list msg = Making completion list... gosub, showmessage list = loop, %nummatches% { stringtrimleft, item, matches%a_index%, 0 list = %list%`n%item% filegetattrib, attrib, %dir%\%item% ifinstring, attrib, D list = %list%\ } stringtrimleft, list, list, 1 sort, list if nummatches > %displaylimit% { stringsplit, sortedmatches, list, `n continueat = 1 gosub, shownextpage prev_filepath = %filepath% } else gosub, showmatchlist msg = gosub, showmessage return ;---------------------------------------------------------------------- ; ; Show match list ; ; Parameters: list - the match list ; showmatchlist: cy = %a_carety% cy += 50 tooltip, %list%, %a_caretx%, %cy% return ;---------------------------------------------------------------------- ; ; Show next page of match list (see global variables documentation) ; shownextpage: stringtrimleft, sortedmatchnum, sortedmatches0, 0 numshown = 0 limitreached = if continueat = 1 list = else { list = ...`n } loop, %sortedmatchnum% { if a_index < %continueat% continue stringtrimleft, item, sortedmatches%a_index%, 0 list = %list%%item%`n numshown += 1 if numshown = %displaylimit% { limitreached = yes if a_index = %sortedmatchesnum% continueat = 1 else { continueat = %a_index% continueat += 1 } break } } if limitreached = { continueat = 1 list = %list% `n } else list = %list%...`n list = %list%Press TAB again to see more matches. gosub, showmatchlist return ;---------------------------------------------------------------------- ; ; Delete a directory component ; deletedirectory: guicontrolget, filepath,, Edit1 stringright, end, filepath, 1 if end = \ stringtrimright, filepath, filepath, 1 stringgetpos, pos, filepath, \, r1 if ErrorLevel = 1 { filepath = } else { pos += 1 stringleft, filepath, filepath, %pos% } arg = %filepath% gosub, showpath return ;---------------------------------------------------------------------- ; ; Change to the selected path ; choosepath: enterpressed = yes goto guiclose ;---------------------------------------------------------------------- ; ; Clean up and exit ; GuiClose: GuiEscape: settimer, closeifinactive, off gui, submit gui, destroy hotkey, tab, off hotkey, enter, off hotkey, ^backspace, off tooltip if enterpressed = yes { winwaitactive, ahk_class #32770 control, EditPaste, %filepath%, Edit1, A send, {enter} } return ;---------------------------------------------------------------------- ; ; Close the GUI if the user activated an other window ; closeifinactive: ifwinnotactive, ahk_id %gui_id% winclose, ahk_id %gui_id% return