# Seek -- by Phi

Navigating the Start Menu can be a hassle, especially if you have installed many programs over time. 'Seek' lets you specify a case-insensitive key word/phrase that it will use to filter only the matching programs and directories from the Start Menu, so that you can easily open your target program from a handful of matched entries. This eliminates the drudgery of searching and traversing the Start Menu.

Download This Script | Other Sample Scripts | Home

    ;*****************************************************************
    ;
    ;  Program : Seek
    ;  Coder   : Phi
    ;  Updated : Mon Jan 31 10:08:37 2005
    ;
    ;  What do you seek, my friend?
    ;
    ;*****************************************************************
    ;
    ;  I have a lot of fun coding this, and hope you will
    ;  enjoy using it too. Feel free to drop me an email with
    ;  your comments and feedback at: phi1618 (*a.t*) gmail
    ;  :D0T: com.
    ;
    ;  Options:
    ;    -cache Use the cached directory-listing if available
    ;           (this is the default mode when no option is specified)
    ;    -scan  Force a directory scan to retrieve the latest
    ;           directory listing
    ;    -scex  Scan & exit (this is useful for scheduling the
    ;           potentially time-consuming directory-scanning as
    ;           a background job)
    ;    -help  Show this help
    ;
    ;*****************************************************************
    ;
    ; HOW TO 'SEEK':
    ;
    ; 1. 'Seek' is an AutoHotkey script. You can either run it
    ;    as Seek.ahk (original script) or Seek.exe (compiled
    ;    executable).
    ;
    ;    To obtain Seek.exe, you can download Seek.zip (includes
    ;    both the source code and the compiled binary) from
    ;    http://home.ripway.com/2004-10/188589/
    ;    Otherwise, you can compile Seek.ahk on your own by
    ;    using AutoHotkey's Ahk2Exe.exe compiler, or you can
    ;    ask me for a copy via email. The filesize is small at
    ;    about 200 kbytes. I can be reached at: phi1618 (*a.t*)
    ;    gmail :D0T: com.
    ;
    ;    To use Seek.ahk, first, you'll need to install
    ;    AutoHotkey v1.0.25 or higher on your PC (download from
    ;    http://www.autohotkey.com). Next, run the command:
    ;
    ;    X:\myTools\AutoHotkey\AutoHotkey.exe Y:\myAHK\Seek.ahk
    ;
    ;    Remember to replace X:\myTools and Y:\myAHK with
    ;    the proper directory names on your PC.
    ;
    ; 2. You can place the executable Seek.exe anywhere you
    ;    want. There is no installation required, it doesn't
    ;    write anything to your registry, and it doesn't
    ;    access the Internet at all (no phoning home). To
    ;    uninstall, simply delete Seek.exe.
    ;
    ;    The only 2 files 'Seek' creates are placed in your
    ;    TMP directory:
    ;
    ;      a. _Seek.key  (cache file for last query string)
    ;      b. _Seek.list (cache file for directory listing)
    ;
    ;    If you're a purist, you can delete them manually
    ;    when you decide to remove 'Seek' from your system.
    ;
    ; 3. The most convenient way to run 'Seek' is via a
    ;    shortcut/hotkey. If you are not already using any
    ;    hotkey management program on your PC, I highly
    ;    recommend AutoHotkey. If you don't intend to install
    ;    any hotkey management program at the moment, you can
    ;    make use of Windows shortcut feature and bind a
    ;    shortcut key (e.g. ALT-F1) to launch 'Seek'. This is
    ;    important so that you can run 'Seek' at anytime and
    ;    anywhere.
    ;
    ; 4. When you run 'Seek' for the first time, it'll scan
    ;    your Start Menu, and save the directory listing into
    ;    a cache file.
    ;
    ;    The following directories are included in the scanning:
    ;    - %A_StartMenu%
    ;    - %A_StartMenuCommon%
    ;
    ;    By default, subsequent runs will read from the
    ;    cache file so as to reduce the loading time. For
    ;    more info on options, run 'Seek.exe -help'. If you
    ;    think your Start Menu doesn't contain too many
    ;    programs, you can choose not to use the cache and
    ;    instruct 'Seek' to always do a directory scan (via
    ;    option -scan).  That way, you will always get the
    ;    latest listing.
    ;
    ; 5. When you run 'Seek', a window will appear, waiting
    ;    for you to enter a key word/phrase. After you have
    ;    entered a query string, a list of matching records
    ;    will be displayed. Next, you need to highlight an
    ;    entry and press <Enter> or click on the 'Open'
    ;    button to run the selected program or open the
    ;    selected directory.
    ;
    ;*****************************************************************
    ;
    ; TECHNICAL NOTES:
    ;
    ; - 'Seek' requires Chris Mallett's AutoHotkey v1.0.25
    ;   or higher version (http://www.autohotkey.com).
    ;   Thanks to Chris for his great work on AutoHotkey. :)
    ;
    ; - The following environment variables must be valid:
    ;   a. TMP
    ;
    ;*****************************************************************
    ;
    ; KNOWN PROBLEMS:
    ;
    ; - Nil
    ;
    ;*****************************************************************
    ;
    ; IMPLEMENTED SUGGESTIONS:
    ;
    ; - Highlight 1st matching record by default so that
    ;   user can just hit <Enter> to run it.
    ;   (Suggested by Yih Yeong)
    ;
    ; - Enable double-click on the listing of the search
    ;   results to launch the program.
    ;   (Suggested by Yih Yeong & Jack)
    ;
    ; - Auto real-time incremental search.
    ;   (Suggested by Rajat)
    ;
    ; - Fuzzy search when user enters multiple query strings,
    ;   separated by space.
    ;   (Suggested by Rajat)
    ;
    ;*****************************************************************
    ;
    ; SUGGESTED FEATURES (MAY OR MAY NOT BE IMPLEMENTED):
    ;
    ; - Log the launch history. List the most frequently
    ;   used programs at the top of the search results.
    ;   (Suggested by Yih Yeong)
    ;
    ; - Instead of using list box, can it display a series
    ;   of application icons so that hovering the cursor
    ;   over the icon will display a tooltip containing the
    ;   program information (path, etc).
    ;   (Suggested by Yih Yeong)
    ;
    ; - Instead of matching text in the middle, match only
    ;   those program/directory names that begin with the
    ;   query string.
    ;   (Suggested by Stefan)
    ;
    ; - Add favorites management. Launch group of programs
    ;   in a single run.
    ;   (Suggested by Atomhrt)
    ;
    ; - Integrate Seek into the Windows taskbar/toolbar so that
    ;   it is always available and there is no need to bind a
    ;   hotkey to launch Seek.
    ;   (Suggested by Deniz Akay)
    ;
    ; - Search by wildcards/regex.
    ;   (Suggested by Steve)
    ;
    ;*****************************************************************
    ;
    ; CHANGE HISTORY:
    ;
    ; * v1.1.0
    ; - Initial release.
    ;
    ; * v1.1.1
    ; - Removed maximise-window option since some programs don't
    ;   function well with it.
    ; - Added double-click detection to trigger 'Open' function.
    ;
    ; * v2.0.0
    ; - Integrated the 'Seek' popup window into the output screen
    ;   so that user can re-enter the query string to search for
    ;   something else without having to exit and run Seek again.
    ; - Added 'Scan Start-Menu' button.
    ; - Added real-time incremental search which will auto
    ;   filter for matching records while you type away,
    ;   without waiting for you to press <Enter>.
    ; - Added internal switch (TrackKeyPhrase) to track search-string.
    ; - Added internal switch (ToolTipFilename) to show filename
    ;   using tooltip.
    ;
    ; * v2.0.1
    ; - Added horizontal scrollbar to ListBox so that very
    ;   long records will not be cut-off in the middle.
    ;
    ; * v2.0.2
    ; - Allowed user to add their own customised list of directories
    ;   to be included in the scanning. User just needs to create a
    ;   text file 'Seek.dir' in the same directory as Seek.exe or
    ;   Seek.ahk, and specify the full path of the directory to be
    ;   added, one directory per line. Do not enclose the path in
    ;   quotes or double-quotes.
    ;
    ; * v2.0.3
    ; - Added /on option to DIR-command to sort by name.
    ; - Fuzzy search when user enters multiple query strings,
    ;   separated by space, for e.g. "med pla". It's a match
    ;   when all the strings ("med" & "pla") are found. This
    ;   will match "Media Player", "Macromedia Flash Player",
    ;   "Play Medieval King", "medpla", "plamed".
    ; - Corrected tab-movement sequence by adding all buttons
    ;   right from the start, but disable them until they can
    ;   be used.
    ; - Added status bar to replace tooltip-feedback.
    ; - Removed obsolete internal switch (ToolTipFilename).
    ; - Replaced the use of "dir" command with AutoHotkey's
    ;   own "Loop" command for scanning directory contents.
    ;   "dir" cannot handle extended character set and thus
    ;   non-English (e.g German) directory and filename are
    ;   captured wrongly. (Thanks Wolfgang Bujatti and
    ;   Sietse Fliege for testing this modification)
    ; - Added internal switch (ScanMode) to define whether
    ;   files and/or directories are to be included in scan.
    ; - Replaced hardcoded directory paths of Start Menu with
    ;   built-in variables A_StartMenu, A_StartMenuCommon.
    ;   With this, Seek now works for different locales with
    ;   different naming convention of the Start Menu.
    ;   (Thanks Wolfgang Bujatti and Sietse Fliege for help
    ;   in testing another method before these new variables
    ;   are available.)
    ; - Added the pre-selection of the last-run program
    ;   record so that a quick double-<ENTER> will run it.
    ;
    ;*****************************************************************

    ;**************************
    ;<--- BEGIN OF PROGRAM --->
    ;**************************

    ;==== Your Customisation ===================================

    ; Specify which program to use when opening a directory.
    ; If the program cannot be found or is not specified
    ; (i.e. variable is unassigned or assigned a null value),
    ; the default Explorer will be used.
    dirExplorer = E:\utl\xplorer2_lite\xplorer2.exe

    ; User's customised list of additional directories to be
    ; included in the scanning. The full path must not be
    ; enclosed by quotes or double-quotes. If this file is
    ; missing, only the default directories will be scanned.
    SeekMyDir = %A_ScriptDir%\Seek.dir

    ; Specify the filename and directory location to save
    ; the cached directory/program listing. There is no
    ; need to change this unless you want to.
    dirListing = %A_Temp%\_Seek.list

    ; Specify the filename and directory location to save
    ; the cached key word/phrase of last search. There is
    ; no need to change this unless you want to.
    keyPhrase = %A_Temp%\_Seek.key

    ; Track search string (ON/OFF)
    ; If ON, the last-used query string will be re-used as
    ; the default query string the next time you run Seek.
    ; If OFF, the last-used query string will not be tracked
    ; and there will not be a default query string value the
    ; next time you run Seek.
    TrackKeyPhrase = ON

    ; Specify what should be included in scan.
    ; 0: Directories are excluded (only files).
    ; 1: All files and directories are included.
    ; 2: Only directories are included (no files).
    ScanMode = 1

    ;...........................................................

    ; INIT
    ;#NoTrayIcon
    StringCaseSense, Off
    version = Seek v2.0.3

    ; DISPLAY HELP INSTRUCTIONS
    If 1 in --help,-help,/h,-h,/?,-?
    {
        MsgBox,, %version%, Navigating the Start Menu can be a hassle, especially if you have installed many programs over time. 'Seek' lets you specify a case-insensitive key word/phrase that it will use to filter only the matching programs and directories from the Start Menu, so that you can easily open your target program from a handful of matched entries. This eliminates the drudgery of searching and traversing the Start Menu.`n`nI have a lot of fun coding this, and hope you will enjoy using it too. Feel free to drop me an email with your comments and feedback at: phi1618 (*a.t*) gmail :D0T: com.`n`nOptions:`n  -cache`tUse the cached directory-listing if available (this is the default mode when no option is specified)`n  -scan`tForce a directory scan to retrieve the latest directory listing`n  -scex`tScan & exit (this is useful for scheduling the potentially time-consuming directory-scanning as a background job)`n  -help`tShow this help
        Goto QuitNoSave
    }

    ; CHECK THAT THE MANDATORY ENVIRONMENT VARIABLES EXIST AND ARE VALID
    ; *TMP*
    IfNotExist, %A_Temp% ; PATH DOES NOT EXIST
    {
        MsgBox This mandatory environment variable is either not defined or invalid:`n`n    TMP = %A_Temp%`n`nPlease fix it before running Seek.
        Goto QuitNoSave
    }

    ; IF NOT SCAN-AND-EXIT
    IfNotEqual 1, -scex
    {
        ; RETRIEVE THE LAST USED KEY-PHRASE FROM CACHE FILE
        ; TO BE USED AS THE DEFAULT QUERY STRING
        If TrackKeyPhrase = ON
        {
            FileReadLine, PrevKeyPhrase, %keyPhrase%, 1
            FileReadLine, PrevOpenTarget, %keyPhrase%, 2
        }
        NewKeyPhrase = %PrevKeyPhrase%
        NewOpenTarget = %PrevOpenTarget%

        ; ADD THE TEXT BOX FOR USER TO ENTER THE QUERY STRING
        Gui, 1:Add, Edit, vFilename W600, %NewKeyPhrase%

        ; ADD MY FAV TAGLINE
        Gui, 1:Add, Text, X625 Y10, What do you seek, my friend?

        ; ADD THE STATUS BAR FOR PROVIDING FEEDBACK TO USER
        Gui, 1:Add, Text, vStatusBar X10 Y31 R1 W764

        ; ADD THE SELECTION LISTBOX FOR DISPLAYING SEARCH RESULTS
        Gui, 1:Add, ListBox, vOpenTarget gTargetSelection X10 Y53 R28 W764 HScroll Disabled, %List%

        ; ADD THESE BUTTONS, BUT DISABLE THEM FOR NOW
        Gui, 1:Add, Button, gButtonOPEN vButtonOPEN Default X10 Y446 Disabled, Open
        Gui, 1:Add, Button, gButtonOPENDIR vButtonOPENDIR X59 Y446 Disabled, Open Directory
        Gui, 1:Add, Button, gButtonSCANSTARTMENU vButtonSCANSTARTMENU X340 Y446 Disabled, Scan Start-Menu

        ; ADD THE EXIT BUTTON
        Gui, 1:Add, Button, gButtonEXIT X743 Y446, Exit

        ; POP-UP THE QUERY WINDOW
        Gui, 1:Show, Center, %version%
    }

    ; ENABLE RE-SCANNING OF LATEST DIRECTORY LISTING
    If 1 in -scan,-scex
        rescan = Y
    ; CHECK WHETHER THE DIRECTORY LISTING CACHE FILE ALREADY EXISTS. IF NOT, DO A RE-SCAN.
    Else IfNotExist, %dirListing%
        rescan = Y

    If rescan = Y ; DO A RE-SCAN
    {
        ; SHOW STATUS UNLESS USER SPECIFIES SCAN-AND-EXIT OPTION
        IfNotEqual 1, -scex
            GuiControl,, StatusBar, Scanning directory listing...

        ; SCAN START-MENU AND STORE DIRECTORY/PROGRAM LISTINGS IN CACHE FILE
        Gosub ScanStartMenu

        ; QUIT IF USER SPECIFIES SCAN-AND-EXIT OPTION
        IfEqual 1, -scex, Goto, QuitNoSave
    }

    GuiControl,, StatusBar, Retrieving last query result...

    ; RETRIEVE THE MATCHING LIST FOR THE LAST USED KEY-PHRASE
    Gosub SilentFindMatches

    ; REMOVE THE STATUS TEXT
    GuiControl,, StatusBar,

    ; DIRECTORY LISTING IS NOW LOADED. ENABLE THE OTHER BUTTONS.
    ; THESE BUTTONS ARE DISABLED EARLIER BECAUSE THEY SHOULD NOT
    ; BE FUNCTIONAL UNTIL THIS PART OF THE SCRIPT.
    GuiControl, 1:Enable, ButtonOPEN
    GuiControl, 1:Enable, ButtonOPENDIR
    GuiControl, 1:Enable, ButtonSCANSTARTMENU

    ; TURN ON INCREMENTAL SEARCH
    SetTimer, tIncrementalSearch, 500

    ; REFRESH THE GUI
    Gosub EnterQuery

    Return

    ;***********************************************************
    ;                                                          *
    ;                 END OF MAIN PROGRAM                      *
    ;                                                          *
    ;***********************************************************

    ;=== BEGIN ButtonSCANSTARTMENU EVENT =======================

    ButtonSCANSTARTMENU:

    Gui, 1:Submit, NoHide
    GuiControl,, StatusBar, Scanning directory listing...

    ; DISABLE LISTBOX WHILE SCANNING IS IN PROGRESS
    GuiControl, 1:Disable, OpenTarget
    GuiControl, 1:Disable, ButtonEXIT
    GuiControl, 1:Disable, ButtonOPEN
    GuiControl, 1:Disable, ButtonOPENDIR
    GuiControl, 1:Disable, ButtonSCANSTARTMENU

    ; DO THE SCANNING
    Gosub ScanStartMenu

    ; INFORM USER THAT SCANNING HAS COMPLETED
    If Filename =
    {
        ; IF QUERY STRING IS EMPTY...
        GuiControl, 1:Enable, ButtonEXIT
        GuiControl, 1:Enable, ButtonOPEN
        GuiControl, 1:Enable, ButtonSCANSTARTMENU
        GuiControl,, StatusBar, Scan completed.
        Gosub EnterQuery
    }
    Else
    {
        ; IF QUERY STRING EXISTS...
        ; FILTER FOR SEARCH STRING WITH THE NEW LISTING
        NewKeyPhrase =
        Gosub FindMatches
    }
    Return

    ;... END ButtonSCANSTARTMENU EVENT .........................

    ;=== BEGIN ScanStartMenu SUBROUTINE ========================
    ; SCAN THE START-MENU AND STORE THE DIRECTORY/PROGRAM
    ; LISTINGS IN A CACHE FILE
    ScanStartMenu:

    ; DEFINE THE DIRECTORY PATHS TO RETRIEVE.
    ; THE PATH MUST NOT BE ENCLOSED BY QUOTES OR DOUBLE-QUOTES.
    ;
    ; FOR ENGLISH VERSION OF WINDOWS
    scanPath = %A_StartMenu%|%A_StartMenuCommon%

    ; INCLUDE ADDITIONAL USER-DEFINED PATHS FOR SCANNING
    IfExist, %SeekMyDir%
    {
        Loop, read, %SeekMyDir%
        {
            IfNotExist, %A_LoopReadLine%
                MsgBox, 8192, %version%, Processing your customised directory list...`n`n"%A_LoopReadLine%" does not exist and will be excluded from the scanning.`nPlease update [ %SeekMyDir% ].
            Else
                scanPath = %scanPath%|%A_LoopReadLine%
        }
    }

    ; DELETE EXISTING FILE BEFORE CREATING A NEW VERSION
    FileDelete, %dirListing%

    ; SCAN DIRECTORY LISTING (DELIMITER = |) BY RECURSING
    ; EACH DIRECTORY TO RETRIEVE THE CONTENTS. HIDDEN FILES
    ; ARE EXCLUDED.
    Loop, parse, scanPath, |
    {
        Loop, %A_LoopField%\*, %ScanMode%, 1
        {
            FileGetAttrib, fileAttrib, %A_LoopFileFullPath%
            IfNotInString, fileAttrib, H ; EXCLUDE HIDDEN FILE
                FileAppend, %A_LoopFileFullPath%`n, %dirListing%
        }
    }

    Return

    ;... END ScanStartMenu SUBROUTINE ..........................

    ;=== BEGIN FindMatches SUBROUTINE ==========================
    ; SEARCH AND DISPLAY ALL MATCHING RECORDS IN THE LISTBOX
    FindMatches:

    Gui, 1:Submit, NoHide
    CurFilename = %Filename%
    GuiControl,, StatusBar,

    ; CHECK FOR EMPTY QUERY STRING
    If CurFilename =
    {
        MsgBox, 8192, %version%, Please enter the key word/phrase to search for.
        Goto EnterQuery
    }

    ; tIncrementalSearch IS BEING INTERRUPTED. LET IT FINISHES.
    If NewKeyPhrase <> %CurFilename%
    {
        ; INFORM USER THAT PATIENCE IS A VIRTUE
        GuiControl,, StatusBar, Seeking...
        ResumeFindMatches = TRUE
        Return
    }

    If List = |
    {
        ; NOT EVEN A SINGLE MATCHING RECORD IS FOUND.
        ; LET USER MODIFY THE QUERY STRING AND TRY AGAIN.
        MsgBox, 8192, %version%, The query string "%CurFilename%" does not match any record. Try again.
        GuiControl, 1:Disable, ButtonOPENDIR
        GuiControl, 1:Enable, ButtonSCANSTARTMENU
        Goto EnterQuery
    }
    Else
    {
        ; SELECT THE FIRST RECORD IF NO OTHER RECORD HAS BEEN SELECTED
        Gui, 1:Submit, NoHide
        GuiControl, 1:Enable, OpenTarget
        GuiControl, 1:Enable, ButtonOPEN
        GuiControl, 1:Enable, ButtonOPENDIR
        GuiControl, 1:Enable, ButtonSCANSTARTMENU
        GuiControl, Focus, OpenTarget
        If OpenTarget =
            GuiControl, 1:Choose, OpenTarget, |1
    }

    ; REFRESH GUI
    Gui, 1:Show, Center, %version%

    Return

    ;... END FindMatches SUBROUTINE ............................

    ;=== BEGIN SilentFindMatches SUBROUTINE ====================

    SilentFindMatches:

    Gui, 1:Submit, NoHide
    sfmFilename = %Filename%

    ; FILTER MATCHING RECORDS BASED ON USER QUERY STRING
    List = |
    If sfmFilename <>
    {
        Loop, read, %dirListing%
        {
            Gui, 1:Submit, NoHide
            tFilename = %Filename%
            If sfmFilename <> %tFilename%
            {
                ; USER HAS CHANGED THE SEARCH STRING. THERE IS NO POINT
                ; TO CONTINUE SEARCHING USING THE OLD STRING, SO ABORT.
                Return
            }
            Else
            {
                ; APPEND MATCHING RECORDS INTO THE LIST
                SplitPath, A_LoopReadLine, name, dir, ext, name_no_ext, drive
                MatchFound = Y
                Loop, parse, sfmFilename, %A_Space%
                {
                    IfNotInString, name, %A_LoopField%
                    {
                        MatchFound = N
                        Break
                    }
                }
                IfEqual, MatchFound, Y
                {
                    ; ADD RECORD TO LIST
                    List = %List%%A_LoopReadLine%|

                    ; PRE-SELECT IF THIS MATCHES THE LAST-RUN PROGRAM
                    If (A_LoopReadLine = PrevOpenTarget && sfmFilename = PrevKeyPhrase)
                        List = %List%|
                }
            }
        }
    }

    ; REFRESH LIST WITH SEARCH RESULTS
    GuiControl, 1:, OpenTarget, %List%

    If List = |
    {
        ; NO MATCHING RECORD IS FOUND
        ; DISABLE LISTBOX
        GuiControl, 1:Disable, OpenTarget
        GuiControl, 1:Disable, ButtonOPENDIR
    }
    Else
    {
        ; MATCHING RECORDS ARE FOUND
        ; ENABLE LISTBOX
        GuiControl, 1:Enable, OpenTarget
        GuiControl, 1:Enable, ButtonOPENDIR
    }

    ; REFRESH GUI
    Gui, 1:Show, Center, %version%

    Return

    ;... END SilentFindMatches SUBROUTINE ......................

    ;=== BEGIN EnterQuery SUBROUTINE ===========================
    ; REFRESH GUI AND LET USER ENTERS SEARCH STRING
    EnterQuery:
    GuiControl, Focus, Filename
    GuiControl, 1:Enable, ButtonOPEN
    Gui, 1:Show, Center, %version%
    Return
    ;... END EnterQuery SUBROUTINE .............................

    ;=== BEGIN TargetSelection EVENT ===========================

    TargetSelection:
    Gui, 1:Submit, NoHide

    ; DOUBLE-CLICK DETECTION TO LAUNCH PROGRAM
    If A_GuiControlEvent = DoubleClick
    {
        Gosub ButtonOPEN
    }
    Else
    {
        ; STUB - FOR FUTURE USE
        If A_GuiControlEvent = Normal
        {
            ; DO NOTHING FOR NOW
        }
    }

    Return

    ;... END TargetSelection EVENT .............................

    ;=== BEGIN ButtonOPEN EVENT ================================

    ; USER CLICKED ON 'OPEN' BUTTON OR PRESSED <ENTER>
    ButtonOPEN:
    Gui, 1:Submit, NoHide

    ; FIND OUT WHERE THE KEYBOARD FOCUS WAS. IF IT'S THE
    ; TEXT FIELD, RUN THE QUERY TO FIND MATCHES. ELSE, IT
    ; MUST BE FROM THE LISTBOX.
    GuiControlGet, focusControl, 1:Focus
    If focusControl = Edit1
    {
        GuiControl, Focus, OpenTarget
        GuiControl, 1:Disable, OpenTarget
        GuiControl, 1:Disable, ButtonOPENDIR
        GuiControl, 1:Disable, ButtonSCANSTARTMENU
        Goto FindMatches
    }

    ; NO RECORD FROM THE LISTBOX IS SELECTED
    If OpenTarget =
    {
        MsgBox, 8192, %version%, Please make a selection before hitting <Enter>.`nPress <Esc> to exit.
        Goto EnterQuery
    }

    ; SELECTED RECORD DOES NOT EXIST (FILE OR DIRECTORY NOT FOUND)
    IfNotExist, %OpenTarget%
    {
        MsgBox, 8192, %version%, %OpenTarget% does not exist. This means that the directory cache is outdated. You may click on the 'Scan Start-Menu' button below to update the directory cache with your latest directory listing now.
        Goto EnterQuery
    }

    ; CHECK WHETHER THE SELECTED RECORD IS A FILE OR DIRECTORY
    FileGetAttrib, fileAttrib, %OpenTarget%
    IfInString, fileAttrib, D ; IS DIRECTORY
    {
        Gosub sOpenDir
    }
    Else If fileAttrib <> ; IS FILE
    {
        Run, %OpenTarget%
    }
    Else
    {
        MsgBox %OpenTarget% is neither a DIRECTORY or a FILE. This shouldn't happen. Seek cannot proceed. Quitting...
    }

    Goto Quit

    ;... END ButtonOPEN EVENT ..................................

    ;=== BEGIN ButtonOPENDIR EVENT =============================

    ; USER CLICKED ON 'OPEN DIRECTORY' BUTTON
    ButtonOPENDIR:
    Gui, 1:Submit, NoHide

    ; CHECK THAT USER HAS SELECTED A RECORD ALREADY
    If OpenTarget =
    {
        MsgBox, 8192, %version%, Please make a selection first.
        Goto EnterQuery
    }

    ; RUN SUBROUTINE TO OPEN A DIRECTORY
    Gosub sOpenDir

    Goto Quit

    ;... END ButtonOPENDIR EVENT ...............................

    ;=== BEGIN sOpenDir SUBROUTINE =============================

    sOpenDir:

    ; IF USER SELECTED A FILE-RECORD INSTEAD OF A DIRECTORY-RECORD,
    ; EXTRACT THE DIRECTORY PATH. (I'M USING DriveGet INSTEAD OF
    ; FileGetAttrib TO ALLOW THE SCENARIO WHEREBY OpenTarget IS
    ; INVALID BUT THE DIRECTORY PATH OF OpenTarget IS VALID.
    DriveGet, status, status, %OpenTarget%
    If status <> Ready ; NOT A DIRECTORY
    {
        SplitPath, OpenTarget, name, dir, ext, name_no_ext, drive
        OpenTarget = %dir%
    }

    ; CHECK WHETHER DIRECTORY EXISTS
    IfNotExist, %OpenTarget%
    {
        MsgBox, 8192, %version%, %OpenTarget% does not exist. This means that the directory cache is outdated. You may click on the 'Scan Start-Menu' button below to update the directory cache with your latest directory listing now.
        Goto EnterQuery
    }

    ; OPEN THE DIRECTORY
    IfExist, %dirExplorer%
    {
        Run, "%dirExplorer%" "%OpenTarget%", , Max ; OPEN WITH CUSTOMISED FILE EXPLORER
    }
    Else
    {
        Run, %OpenTarget%, , Max ; OPEN WITH DEFAULT WINDOWS FILE EXPLORER
    }
    Return

    ;... END sOpenDir SUBROUTINE ...............................

    ;=== BEGIN tIncrementalSearch EVENT ========================
    ; AUTOMATICALLY CONDUCT REAL-TIME INCREMENTAL SEARCH
    ; TO FIND MATCHING RECORDS WITHOUT WAITING FOR USER
    ; TO PRESS <ENTER>
    tIncrementalSearch:

    Loop
    ; REPEAT SEARCHING UNTIL USER HAS STOPPED CHANGING THE QUERY STRING
    {
        Gui, 1:Submit, NoHide
        CurFilename = %Filename%
        If NewKeyPhrase <> %CurFilename%
        {
            OpenTarget =
            Gosub SilentFindMatches
            NewKeyPhrase = %CurFilename%
            Sleep, 100 ; DON'T HOG THE CPU!
        }
        Else
        {
            ; QUERY STRING HAS STOPPED CHANGING
            Break
        }
    }

    ; USER HAS HIT <ENTER> TO LOOK FOR MATCHING RECORDS.
    ; RUN FindMatches NOW.
    If ResumeFindMatches = TRUE
    {
        ResumeFindMatches = FALSE
        Gosub FindMatches
    }

    ; CONTINUE MONITORING FOR CHANGES
    SetTimer, tIncrementalSearch, 500

    Return

    ;... END tIncrementalSearch EVENT ..........................

    ;=== BEGIN Quit SUBROUTINE =================================

    Quit:
    ButtonEXIT:
    GuiClose:
    GuiEscape:

    Gui, 1:Submit, NoHide

    ; SAVE THE KEY WORD/PHRASE FOR NEXT RUN IF IT HAS CHANGED
    If TrackKeyPhrase = ON
    {
        If (PrevKeyPhrase <> Filename || PrevOpenTarget <> OpenTarget)
        {
            FileDelete, %keyPhrase%
            FileAppend, %Filename%`n, %keyPhrase%
            FileAppend, %OpenTarget%`n, %keyPhrase%
        }
    }

    QuitNoSave:
    ExitApp ; JOB DONE. G'DAY!

    ;... END Quit SUBROUTINE ...................................

    ;************************
    ;<--- END OF PROGRAM --->
    ;************************

    ; /* vim: set noexpandtab shiftwidth=4: */