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
;... 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.
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.
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 ========================