#NoTrayIcon #include #include #include #include #include #include ; #SearchContent# ============================================================================================================== ; Name ..........: SearchContent.AU3 ; Description ...: Research folder and subfolders for specific text inside files ; ; Text is not case sensitive ; ; File filter can be modified and new folders can be added at run time ; Author ........: Nine ; Created .......: 2020-04-08 ; Modified ......: 2025-03-31 ; Emprowerment ..: RAMzor 2025-04-21 ; Remarks .......: List of initial folders and file filter can be changed in the Constants Section below ; Example .......: No ; Link ..........: https://www.autoitscript.com/forum/topic/202316-searching-specific-content-in-text-file-or-au3/ ; =============================================================================================================================== Opt("MustDeclareVars", True) Opt("TrayOnEventMode", 1) Opt("TrayMenuMode", 1) Opt("TrayAutoPause", 0) Global Const $ARRAY_OF_FOLDERS = [@ScriptDir, _GetAutoItPath() & "Include", @MyDocumentsDir] Global Const $DEFAULT_FILTER = "*.au3" Global Const $SCALING = _CalcDPI() Global Const $GUI_TITLE = "Search Content" Global Const $ICON_IDX = 337 Global $SEARCH_IN_FILES = True ; Default checked radio button Global $hGUI, $idMenuOpenFile, $idMenuOpenLocation, $idMenuReset, $idMenuCopy, $idMenuSaveList, $idTreeFile, $idTVselect, $idText SearchContent() Func SearchContent() Global $DISPLAY_AS_CHILD If Not _Singleton($GUI_TITLE, 1) Then Exit MsgBox($MB_SYSTEMMODAL, "Error", "An instance of this program already exists") $hGUI = GUICreate($GUI_TITLE, 800, 690, -1, 0, $WS_THICKFRAME + $GUI_SS_DEFAULT_GUI) _WinAPI_SetCurrentProcessExplicitAppUserModelID($GUI_TITLE) GUISetFont(11 * $SCALING) GUISetIcon("shell32.dll", $ICON_IDX) Local $idSelect = GUICtrlCreateButton("Select Folder", 8, 15, 110, 30) GUICtrlSetResizing(-1, 802) Local $idFolder = GUICtrlCreateCombo("", 130, 18, 662, 25, $CBS_DROPDOWNLIST + $CBS_AUTOHSCROLL) GUICtrlSetResizing(-1, 544+6) GUICtrlCreateLabel("Filters", 10, 55, 50, 25, $SS_CENTERIMAGE) GUICtrlSetResizing(-1, 802) Local $idFilter = GUICtrlCreateInput($DEFAULT_FILTER, 55, 55, 153, 25) GUICtrlSetResizing(-1, 802) GUICtrlSendMsg(-1, 0X1501, True, "e.g. *.au3;*.txt") GUICtrlSetTip(-1, 'Multiple filters must be separated by ";"' & @CRLF & _ 'Use "|" to separate 3 sets of filters:' & @CRLF & _ '"Include|Exclude|Exclude_Folders"') GUICtrlSetFont(-1, 10 * $SCALING) GUICtrlCreateLabel("Text to search", 225, 55, 100, 25, $SS_CENTERIMAGE) GUICtrlSetResizing(-1, 802) $idText = GUICtrlCreateInput("", 320, 55, 472, 25) GUICtrlSendMsg(-1, 0X1501, True, "Text to search") GUICtrlSetResizing(-1, 512+32+4+2) Local $idSearchByName = GUICtrlCreateRadio("Search in file/folder name", 8, 90, -1, 15) GUICtrlSetResizing(-1, 802) Local $idSearchInFile = GUICtrlCreateRadio("Search in file", 8, 110, -1, 15) GUICtrlSetResizing(-1, 802) If $SEARCH_IN_FILES Then $DISPLAY_AS_CHILD = True ; set to False if initial treeview list should NOT display the child indicator GUICtrlSetState($idSearchInFile, $GUI_CHECKED) Else $DISPLAY_AS_CHILD = False ; set to False if initial treeview list should NOT display the child indicator GUICtrlSetState($idSearchByName, $GUI_CHECKED) EndIf $idTreeFile = GUICtrlCreateTreeView(8, 135, 783, 480, -1, $WS_EX_CLIENTEDGE) GUICtrlSetResizing(-1, 2+4+32+64) GUICtrlSetFont(-1, 9 * $SCALING) Local $idSearch = GUICtrlCreateButton(" Search", 8, 621, 120, 40, $BS_DEFPUSHBUTTON) GUICtrlSetImage(-1, "shell32.dll", 134) GUICtrlSetResizing(-1, 768+64+2) Local $idOpen = GUICtrlCreateButton(" Open", 148, 621, 120, 40) GUICtrlSetImage(-1, "shell32.dll", 46) GUICtrlSetResizing(-1, 768+64+2) GUICtrlSetState(-1, $GUI_DISABLE) Local $idReset = GUICtrlCreateButton(" Reset", 288, 621, 120, 40) GUICtrlSetImage(-1, "shell32.dll", 16739) GUICtrlSetResizing(-1, 768+64+2) GUICtrlSetState(-1, $GUI_DISABLE) Local $idSaveList = GUICtrlCreateButton(" Save List", 428, 621, 120, 40) GUICtrlSetImage(-1, "shell32.dll", 16761);231 GUICtrlSetResizing(-1, 768+64+2) GUICtrlSetState(-1, $GUI_DISABLE) Local $idProgress = GUICtrlCreateLabel("", 0, 666, 800, 25, $SS_CENTER + $SS_CENTERIMAGE + $SS_SUNKEN) GUICtrlSetColor(-1, 0xFF0000) GUICtrlSetResizing(-1, 2+4+64+512) GUISetState(@SW_SHOW) Local $idContextmenu = GUICtrlCreateContextMenu($idTreeFile) $idMenuOpenFile = GUICtrlCreateMenuItem("Open File (Double Click) Ctrl+O", $idContextmenu) $idMenuOpenLocation = GUICtrlCreateMenuItem("Open Location In Explorer Ctrl+E", $idContextmenu) $idMenuReset = GUICtrlCreateMenuItem("Reset Ctrl+R", $idContextmenu) $idMenuCopy = GUICtrlCreateMenuItem("Copy Information Ctrl+C", $idContextmenu) $idMenuSaveList = GUICtrlCreateMenuItem("Save The List Ctrl+S", $idContextmenu) ; Set GUIAccelerators for the button controlIDs, these being Ctrl + y and Ctrl + n Local $aAccelKeys[5][2] = [["^o", $idMenuOpenFile], ["^e", $idMenuOpenLocation], ["^r", $idMenuReset], ["^c", $idMenuCopy], ["^s", $idMenuSaveList]] GUISetAccelerators($aAccelKeys) Local $sFolder, $aSelect[1], $idParent, $aFoundList[1] GUICtrlSetData($idFolder, _ArrayToString($ARRAY_OF_FOLDERS), $ARRAY_OF_FOLDERS[0]) GUIRegisterMsg($WM_NOTIFY, WM_NOTIFY) GUIRegisterMsg($WM_GETMINMAXINFO, WM_GETMINMAXINFO) While True Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $GUI_EVENT_MINIMIZE GUISetState(@SW_HIDE) TraySetIcon("shell32.dll", $ICON_IDX) TraySetOnEvent($TRAY_EVENT_PRIMARYUP, _GUI_Restore) TraySetOnEvent($TRAY_EVENT_SECONDARYUP, _GUI_Exit) TraySetState($TRAY_ICONSTATE_SHOW) TraySetToolTip("Left click to restore" & @CRLF & "Right click to Exit") Case $idSearchByName $DISPLAY_AS_CHILD = False ; set to False if initial treeview list should NOT display the child indicator $SEARCH_IN_FILES = False Case $idSearchInFile $DISPLAY_AS_CHILD = True ; set to False if initial treeview list should NOT display the child indicator $SEARCH_IN_FILES = True Case $idSelect $sFolder = FileSelectFolder("Select root folder", @ScriptDir, 0, @ScriptDir, $hGUI) If @error Then ContinueLoop GUICtrlSetData($idFolder, $sFolder, $sFolder) Case $idSearch ReDim $aSelect[1] $aSelect[0] = 0 GUICtrlSetState($idSaveList, $GUI_DISABLE) $aFoundList = _SearchText($idTreeFile, GUICtrlRead($idFolder), GUICtrlRead($idFilter), GUICtrlRead($idText), $idProgress) If $aFoundList[0] Then GUICtrlSetState($idSaveList, $GUI_ENABLE) Case $idOpen, $idMenuOpenFile $idTVselect = GUICtrlRead($idTreeFile) _OpenFile(GUICtrlRead($idTreeFile, $GUI_READ_EXTENDED), GUICtrlRead($idText)) Case $idMenuOpenLocation $idTVselect = GUICtrlRead($idTreeFile) _OpenFileLocation(GUICtrlRead($idTreeFile, $GUI_READ_EXTENDED)) Case $idFilter If StringStripWS(GUICtrlRead($idFilter), $STR_STRIPLEADING) = "" Then GUICtrlSetData($idFilter, $DEFAULT_FILTER) Case $idReset, $idMenuReset ReDim $aSelect[1] $aSelect[0] = 0 GUICtrlSetData($idText, "") GUICtrlSetData($idProgress, "") _GUICtrlTreeView_DeleteAll($idTreeFile) Case $idMenuCopy _ClipInformation($idTreeFile) Case $idSaveList, $idMenuSaveList If UBound($aFoundList) > 1 Then Local $sText For $i = 1 To $aFoundList[0] $sText &= $aFoundList[$i] & @CRLF Next Local $sFile = FileSaveDialog("Save As...", "", "Text File (*.txt)|All (*.*)") If Not @error Then FileWrite($sFile, $sText) EndIf EndSwitch $idTVselect = GUICtrlRead($idTreeFile) If Not $idTVselect And Not BitAND(GUICtrlGetState($idOpen), $GUI_DISABLE) Then ContinueLoop GUICtrlSetState($idOpen, $GUI_DISABLE) If $idTVselect Then If _GUICtrlTreeView_GetParentHandle($idTreeFile, $idTVselect) Then If Not BitAND(GUICtrlGetState($idOpen), $GUI_DISABLE) Then GUICtrlSetState($idOpen, $GUI_DISABLE) ContinueLoop EndIf If BitAND(GUICtrlGetState($idOpen), $GUI_DISABLE) Then GUICtrlSetState($idOpen, $GUI_ENABLE) For $i = 1 To $aSelect[0] If $idTVselect = $aSelect[$i] Then ContinueLoop 2 Next _ArrayAdd($aSelect, $idTVselect) $aSelect[0] += 1 _DisplayLine($hGUI, $idTreeFile, $idTVselect, ControlTreeView($hGUI, "", $idTreeFile, "GetSelected"), GUICtrlRead($idText)) EndIf WEnd EndFunc ;==>SearchContent Func _SearchText($idTree, $sFolder, $sFilter, $sText, $idProg) Local $iFound = 0, $iDir = 1, $idItem GUISetCursor($MCID_WAIT, $GUI_CURSOR_OVERRIDE) _GUICtrlTreeView_DeleteAll($idTree) GUICtrlSetData($idProg, "") Local $aDir = _FileListToArrayRec($sFolder, "*", $FLTAR_FOLDERS, $FLTAR_RECUR) If Not @error Then $iDir += $aDir[0] GUICtrlSetData($idProg, "Parsing " & $iDir & " folders...") Local $aFile = _FileListToArrayRec($sFolder, $sFilter, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH) ;~ Local $aFile = _FileListToArrayRec($sFolder, $sFilter, $FLTAR_FILESFOLDERS, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH) If @error Then GUISetCursor() Return MsgBox($MB_SYSTEMMODAL, "Warning", "No file found") EndIf GUICtrlSetData($idProg, "Parsing " & $iDir & " folders - " & $aFile[0] & " files...") Local $aFound[$aFile[0]+1] For $i = 1 To $aFile[0] If $SEARCH_IN_FILES Then ; Search in files If Not $sText Or StringInStr(FileRead($aFile[$i]), $sText) Then $idItem = GUICtrlCreateTreeViewItem($aFile[$i], $idTree) If $DISPLAY_AS_CHILD Then _GUICtrlTreeView_SetChildrenEX($idTree, $idItem) $iFound += 1 $aFound[$iFound] = $aFile[$i] EndIf Else ; Search by part of file/folder name If Not $sText Or StringInStr($aFile[$i], $sText) Then $idItem = GUICtrlCreateTreeViewItem($aFile[$i], $idTree) If $DISPLAY_AS_CHILD Then _GUICtrlTreeView_SetChildrenEX($idTree, $idItem) $iFound += 1 $aFound[$iFound] = $aFile[$i] EndIf EndIf Next $aFound[0] = $iFound ReDim $aFound[$iFound+1] GUISetCursor() GUICtrlSetData($idProg, "Parsed " & $aFile[0] & " files in " & $iDir & " folders - " & $iFound & " files found") If Not $iFound Then MsgBox($MB_SYSTEMMODAL, "Error", "Text was not found") Return $aFound EndFunc ;==>_SearchText Func _GUICtrlTreeView_SetChildrenEX($hWnd, $idItem, $bFlag = True) Local Static $tItem = DllStructCreate($tagTVITEMEX) $tItem.Mask = BitOR($TVIF_HANDLE, $TVIF_CHILDREN) $tItem.hItem = _GUICtrlTreeView_GetItemHandle($hWnd, $idItem) $tItem.Children = $bFlag Return __GUICtrlTreeView_SetItem($hWnd, $tItem) EndFunc ;==>_GUICtrlTreeView_SetChildrenEX Func _DisplayLine($hGUI, $idTree, $idItem, $sItem, $sText) If Not $sText Then Return Local $aLine = FileReadToArray($sItem) For $i = 0 To UBound($aLine) - 1 If StringInStr($aLine[$i], $sText) Then GUICtrlCreateTreeViewItem($aLine[$i], $idItem) Next ControlTreeView($hGUI, "", $idTree, "Expand", $sItem) EndFunc ;==>DisplayLine Func _OpenFile($sFile, $sText = "") Local $sDrive, $sDir, $sFileName, $sExtension _PathSplit($sFile, $sDrive, $sDir, $sFileName, $sExtension) If $sText <> "" Then ClipPut($sText) ShellExecute($sFile, "", $sDrive & $sDir, "open") EndFunc ;==>OpenFile Func _OpenFileLocation($sFile) Run("explorer.exe /n,/e,/select," & $sFile) EndFunc ;==>OpenFileLocation Func _CalcDPI() Local Const $BASE_SCALING = 96 Local $iDPI = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "AppliedDPI") If @error Then Return 1 Return Round($BASE_SCALING / $iDPI, 2) EndFunc ;==>CalcDPI Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam) Local $aRect, $aPos, $aCtrlPos If GUICtrlGetHandle($idTreeFile) = $tNMHDR.hwndFrom Then Switch $tNMHDR.Code Case $NM_RCLICK $aCtrlPos = ControlGetPos($hWnd, "", $idTreeFile) $aRect = _GUICtrlTreeView_DisplayRect($idTreeFile, $idTVselect) $aPos = GUIGetCursorInfo() $aPos[0] -= $aCtrlPos[0] $aPos[1] -= $aCtrlPos[1] If $idTVselect And Not _GUICtrlTreeView_GetParentHandle($idTreeFile, $idTVselect) And _ $aPos[0] >= $aRect[0] And $aPos[0] <= $aRect[2] And $aPos[1] >= $aRect[1] And $aPos[1] <= $aRect[3] Then GUICtrlSetState($idMenuOpenFile, $GUI_ENABLE) Else GUICtrlSetState($idMenuOpenFile, $GUI_DISABLE) EndIf Case $NM_DBLCLK $idTVselect = GUICtrlRead($idTreeFile) _OpenFile(GUICtrlRead($idTreeFile, $GUI_READ_EXTENDED), GUICtrlRead($idText)) EndSwitch EndIf Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func _GUI_Restore() TraySetState($TRAY_ICONSTATE_HIDE) GUISetState(@SW_SHOW) WinActivate($hGUI) EndFunc ;==>GUI_Restore Func _GUI_Exit() Exit EndFunc ;==>GUI_Exit Func WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam) Local $tMinMaxInfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam) DllStructSetData($tMinMaxInfo, 7, 630) ; min width DllStructSetData($tMinMaxInfo, 8, 435) ; min height Return $GUI_RUNDEFMSG EndFunc ;==>WM_GETMINMAXINFO Func _ClipInformation($idLV) Local $idTVsel = GUICtrlRead($idLV) If Not $idTVsel Then ClipPut("") Local $sString = _GUICtrlTreeView_GetText($idLV, _GUICtrlTreeView_GetSelection($idLV)) Local $sDrive, $sDir, $sFileName, $sExtension If _GUICtrlTreeView_GetParentHandle($idLV, $idTVsel) Then ClipPut(StringStripWS($sString, $STR_STRIPLEADING + $STR_STRIPTRAILING)) Else _PathSplit($sString, $sDrive, $sDir, $sFileName, $sExtension) ClipPut($sFileName & $sExtension) EndIf EndFunc ;==>ClipInformation Func _GetAutoItPath() Local $sAutoIt = RegRead("HKLM\SOFTWARE\" & (@AutoItX64 ? "\Wow6432Node" : "") & "\AutoIt v3\AutoIt", "InstallDir") If @error Then Return SetError(1) Return $sAutoIt & "\" EndFunc ;==>GetAutoItPath