Im Traymenu kann zwischen Deutsch und englisch gewählt werden.
Probiert´s einfach aus, ist selbsterklärend.
Über Feedback freue ich mich immer (egal ob Kritik, Lob, Verbesserungsvorschläge, Bugreports). Danke.
Für das Script sind Teile aus meiner Library nötig, diese findet ihr hier:
Holles_Lib.ahk
Und hier ist das Script:
Code: Select all
SetWorkingDir,%A_ScriptDir%
#NoEnv
#Include Holles_Lib.ahk
IniRead,Language,FileSearch.ini,Options,Language,%A_Space%
if !Language
Language:="English"
gosub %Language%
Menu,tray,Icon,shell32.dll,23,1
Menu,tray,NoStandard
Menu,tray,add,,MenuHandler
Menu,tray,add,%TextChangeLanguage%,MenuHandler
Menu,tray,add,%TextClose%,MainGuiClose
CreateGui:
{
Gui,Main:Font,S12 cDefault,arial
Gui,Main:add,Text,x10 y15 w60,%TextFolder%:
IniRead,Folder,FileSearch.ini,Options,LastFolder,%A_Space%
temp:=Folder?Folder:TextChooseFolder
While(StrPixel(temp,"s12","Arial").width>294) ;reduce stringlength, if path is to long for the button
temp:=StrLeft(temp,3) "..." StrTrimLeft(temp,a_index)
Gui,Main:add,Button,x70 y10 w300 gSelectFolder vSelectFolder,%temp%
Gui,Main:add,CheckBox,w300 Checked vSubFolder,%TextSubFolder%
Gui,Main:add,Text,x10 y90 w60 vTextSearch,%TextSearch%
Gui,Main:add,Edit,x70 yp-3 w300 gCheckValidStart vEditSearch
Gui,Main:add,Text,x70 y120 w70 vTextSearchIn,%TextSearchIn%
Gui,Main:add,Checkbox,x152 w110 yp Checked vCheckSearchName gCheckSearchName,%TextFileName%
Gui,Main:add,Checkbox,x270 w110 yp Checked vCheckSearchContent gCheckSearchContent,%TextFileContent%
Gui,Main:add,CheckBox,x70 y160 vCheckCS,a <> A
Gui,Main:add,CheckBox,x152 y160 vCheckRegEx,%TextRegexSearch%
Gui,Main:add,CheckBox,x70 y200 w140 gCheckFromCreated vCheckFromCreated,%TextFromCreated%
Gui,Main:add,DateTime,x+1 yp-3 w120 Section Disabled vEditFromCreated
Gui,Main:add,CheckBox,x70 y230 gCheckToCreated vCheckToCreated,%TextToCreated%
Gui,Main:add,DateTime,xs ys+30 w120 Disabled vEditToCreated
Gui,Main:add,CheckBox,x70 y270 w140 gCheckFromModified vCheckFromModified,%TextFromModified%
Gui,Main:add,DateTime,x+1 yp-3 w120 Section Disabled vEditFromModified
Gui,Main:add,CheckBox,x70 y300 gCheckToModified vCheckToModified,%TextToModified%
Gui,Main:add,DateTime,xs ys+30 w120 Disabled vEditToModified
Gui,Main:add,CheckBox,x70 y340 gCheckMin vCheckMin,%TextMinSize%
Gui,Main:add,Edit,x+1 yp-3 w60 Section Disabled gEditMin vEditMin
Gui,Main:add,Radio,x+5 y340 w35 vRadioMinByte Checked,B
Gui,Main:add,Radio,xp+35 yp w45 vRadioMinKilo,KB
Gui,Main:add,Radio,xp+45 yp vRadioMinMega,MB
Gui,Main:add,CheckBox,x70 y370 gCheckMax vCheckMax,%TextMaxSize%
Gui,Main:add,Edit,xs ys+30 w60 Disabled gEditMax vEditMax
Gui,Main:add,Radio,x+5 y370 w35 vRadioMaxByte Checked,B
Gui,Main:add,Radio,xp+35 yp w45 vRadioMaxKilo,KB
Gui,Main:add,Radio,xp+45 yp vRadioMaxMega,MB
Gui,Main:add,Button,x10 w360 gStartSearch vStartSearch Default Disabled,%TextStartSearch%
Gui,Main:show,w380,FileSearch
Return
}
StartSearch:
{
SearchAbort:=False
GuiControlGet,EditSearch,Main:
GuiControlGet,SubFolder,Main:
GuiControlGet,CheckSearchName,Main:
GuiControlGet,CheckSearchContent,Main:
GuiControlGet,CheckCS,Main:
GuiControlGet,CheckRegEx,Main:
GuiControlGet,CheckFromCreated,Main:
GuiControlGet,CheckToCreated,Main:
GuiControlGet,CheckFromModified,Main:
GuiControlGet,CheckToModified,Main:
GuiControlGet,CheckMin,Main:
GuiControlGet,CheckMax,Main:
if CheckFromCreated
GuiControlGet,EditFromCreated,Main:
if CheckToCreated
GuiControlGet,EditToCreated,Main:
if CheckFromModified
GuiControlGet,EditFromModified,Main:
if CheckToModified
GuiControlGet,EditToModified,Main:
if CheckMin {
GuiControlGet,EditMin,Main:
GuiControlGet,RadioMinKilo,Main:
GuiControlGet,RadioMinMega,Main:
if RadioMinKilo
EditMin*=1024
else if RadioMinMega
EditMin*=1048576
}
if CheckMax {
GuiControlGet,EditMax,Main:
GuiControlGet,RadioMaxKilo,Main:
GuiControlGet,RadioMaxMega,Main:
if RadioMaxKilo
EditMax*=1024
else if RadioMaxMega
EditMax*=1048576
}
Gui,Result:Destroy
Gui,Result:font,S12 cDefault,arial
Gui,Result:+ownerMain +AlwaysOnTop
Gui,Result:add,Text,x10 y10 vTextFoundInName,%TextFoundInName%
Gui,Result:add,ListBox,x10 yp+20 w600 r10 gListBox vLBName hwndhLBName
Gui,Result:add,Text,x10 y+20 vTextFoundInContent,%TextFoundInContent%
Gui,Result:add,ListBox,x10 yp+20 w600 r10 gListBox vLBContent hwndhLBContent
Gui,Result:Font,S12 cDefault,arial
Gui,Result:add,Text,x10 y+5 w600 vStatus
Gui,Result:add,Button,x120 y+10 w100 vTextOpen,%TextOpen%
Gui,Result:add,Button,x260 yp w100 Default vTextCancel,%TextCancel%
Gui,Result:add,Button,x400 yp w100 vTextClose,%TextClose%
Gui,Result:Font,S12 cTeal,arial
SetTimer,SearchIsRunning,500
Gui,Result:add,Text,x10 yp+5 w110 vRunning,%TextSearchIsRunning%
Gui,Result:show
OnMessage(0x200,"MouseOver") ;WM_MOUSEMOVE
Folder:=StrRight(Folder,1)="\"?Folder:Folder "\"
Loop,% Folder "*.*",,%SubFolder% ;check each file...
{
if SearchAbort
break
if (LastFolder!=A_LoopFileDir) {
LastFolder:=A_LoopFileDir,temp:=A_LoopFileFullPath
While(StrPixel(temp,"s12","Arial").width>600) ;reduce stringlength, if path is to long for the button
temp:=StrLeft(temp,3) "..." StrTrimLeft(temp,a_index)
GuiControl,Result:,Status,%temp%
}
if (CheckFromCreated&&(StrLeft(EditFromCreated,8)>StrLeft(A_LoopFileTimeCreated,8)))
||(CheckToCreated&&(StrLeft(A_LoopFileTimeCreated,8)>StrLeft(EditToCreated,8)))
||(if CheckFromModified&&(StrLeft(EditFromModified,8)>StrLeft(A_LoopFileTimeModified,8)))
||(CheckToModified&&(StrLeft(A_LoopFileTimeModified,8)>StrLeft(EditToModified,8)))
||(CheckMin&&(EditMin>A_LoopFileSize))
||(CheckMax&&(A_LoopFileSize>EditMax))
continue
if CheckSearchName { ;search in file name...
HitNames:=CheckRegEx?RegExMatch(A_LoopFileName,CheckCS?EditSearch:"i)" EditSearch)?A_LoopFileFullPath:"":InStr(A_LoopFileName,EditSearch,CheckCS)?A_LoopFileFullPath:""
if HitNames&&(HitNames!=HitNamesBefore)
GuiControl,Result:,LBName,%HitNames%
HitNamesBefore:=HitNames
}
if CheckSearchContent { ;search in file content
file := FileOpen(A_LoopFileFullPath, "r")
HitContent:=CheckRegEx?RegExMatch(file.Read(),CheckCS?EditSearch:"i)" EditSearch)?A_LoopFileFullPath:"":InStr(file.Read(),EditSearch,CheckCS)?A_LoopFileFullPath:""
if HitContent&&(HitContent!=HitContentBefore) {
GuiControl,Result:,LBContent,%HitContent%
HitContentBefore:=HitContent
}
file.close()
}
}
SetTimer,SearchIsRunning,off
GuiControl,Result:,running
if SearchAbort {
Gui,Result:Font,S12 cRed,Arial
GuiControl,Result:Font,Status
GuiControl,Result:,Status,%TextSearchAborted%
}
else {
Gui,Result:Font,S12 cGreen,Arial
GuiControl,Result:Font,Status
GuiControl,Result:,Status,%TextSearchComplete%
}
return
}
SearchIsRunning:
{
Points:=!Points||(Points>4)?1:Points+1
GuiControl,Result:,running,% TextSearchIsRunning StringChain(".",Points)
return
}
SelectFolder:
{
Gui +OwnDialogs
IniRead,Folder,FileSearch.ini,Options,LastFolder,%A_Space%
FileSelectFolder,Folder,*%Folder%,,%TextChooseFolder%
if !Folder {
GuiControl,Main:,SelectFolder,%TextChooseFolder%
return
}
IniWrite,%Folder%,FileSearch.ini,Options,LastFolder
GuiControl,Main:-Disabled,StartSearch
temp:=Folder
While(StrPixel(temp,"s12","Arial").width>294) ;reduce string length if path is too long for the button
temp:=StrLeft(temp,3) "..." StrTrimLeft(temp,a_index)
GuiControl,Main:,SelectFolder,%temp%
return
}
CheckFromCreated:
{
GuiControlGet,CheckFromCreated,Main:
if CheckFromCreated {
GuiControl,Main:-Disabled,EditFromCreated
GuiControl,Main:-Disabled,StartSearch
}
else {
GuiControl,Main:Disable,EditFromCreated
gosub CheckValidStart
}
return
}
CheckToCreated:
{
GuiControlGet,CheckToCreated,Main:
if CheckToCreated {
GuiControl,Main:-Disabled,EditToCreated
GuiControl,Main:-Disabled,StartSearch
}
else {
GuiControl,Main:Disable,EditToCreated
gosub CheckValidStart
}
return
}
CheckFromModified:
{
GuiControlGet,CheckFromModified,Main:
if CheckFromModified {
GuiControl,Main:-Disabled,EditFromModified
GuiControl,Main:-Disabled,StartSearch
}
else {
GuiControl,Main:Disable,EditFromModified
gosub CheckValidStart
}
return
}
CheckToModified:
{
GuiControlGet,CheckToModified,Main:
if CheckToModified {
GuiControl,Main:-Disabled,EditToModified
GuiControl,Main:-Disabled,StartSearch
}
else {
GuiControl,Main:Disable,EditToModified
gosub CheckValidStart
}
return
}
CheckMin:
{
GuiControlGet,CheckMin,Main:
GuiControlGet,EditMin,Main:
if CheckMin
GuiControl,Main:-Disabled,EditMin
else
GuiControl,Main:Disable,EditMin
if CheckMin&&EditMin
GuiControl,Main:-Disabled,StartSearch
else
gosub CheckValidStart
return
}
CheckMax:
{
GuiControlGet,CheckMax,Main:
GuiControlGet,EditMax,Main:
if CheckMax
GuiControl,Main:-Disabled,EditMax
else
GuiControl,Main:Disable,EditMax
if CheckMax&&EditMax
GuiControl,Main:-Disabled,StartSearch
else
gosub CheckValidStart
return
}
EditMin:
{
GuiControlGet,CheckMin,Main:
GuiControlGet,EditMin,Main:
if CheckMin&&EditMin
GuiControl,Main:-Disabled,StartSearch
else
gosub CheckValidStart
return
}
EditMax:
{
GuiControlGet,CheckMax,Main:
GuiControlGet,EditMax,Main:
if CheckMax&&EditMax
GuiControl,Main:-Disabled,StartSearch
else
gosub CheckValidStart
return
}
CheckValidStart:
{
GuiControlGet,EditSearch,Main:
GuiControlGet,CheckFromCreated,Main:
GuiControlGet,CheckToCreated,Main:
GuiControlGet,CheckFromModified,Main:
GuiControlGet,CheckToModified,Main:
GuiControlGet,CheckMin,Main:
GuiControlGet,EditMin,Main:
GuiControlGet,CheckMax,Main:
GuiControlGet,EditMax,Main:
if EditSearch||CheckFromCreated||CheckToCreated||CheckFromModified||CheckToModified||(CheckMin&&EditMin)||(CheckMax&&EditMax)
GuiControl,Main:-Disabled,StartSearch
else
GuiControl,Main:Disable,StartSearch
return
}
CheckSearchName:
CheckSearchContent:
{
GuiControlGet,CheckSearchName,Main:
GuiControlGet,CheckSearchContent,Main:
if !CheckSearchName&&!CheckSearchContent
GuiControl,Main:,%A_GuiControl%,1
return
}
ResultGuiClose:
ResultButtonBeenden:
ResultButtonClose:
ResultButtonAbbrechen:
ResultButtonCancel:
{
SearchAbort:=True
If (A_GuiControl="TextCancel") {
GuiControl,Result:Disable,TextCancel
return
}
OnMessage(0x200,"") ;WM_MOUSEMOVE
ToolTip
Gui,Result:Destroy
return
}
ResultButtonÖffnen:
ResultButtonOpen:
{
Gui,Result:-AlwaysOnTop
Gui,Result:+OwnDialogs
GuiControlGet,LBName,Result:
GuiControlGet,LBContent,Result:
if LBName
Run,%LBName%
else if LBContent
Run,%LBContent%
return
}
ListBox:
{
GuiControlGet,LBName,Result:
GuiControlGet,LBContent,Result:
if (A_GuiControl="LBName")&&LBName
GuiControl,Choose,ListBox2,0
else if (A_GuiControl="LBContent")&&LBContent
GuiControl,Choose,ListBox1,0
if (A_GuiEvent = "DoubleClick")
gosub ResultButtonOpen
return
}
MenuHandler:
{
Language:=A_ThisMenuItem="Change to English"?"English":"Deutsch"
Menu,Tray,Rename,%A_ThisMenuItem%,% Language="English"?"Zu Deutsch wechseln":"Change to English"
Menu,Tray,Rename,%TextClose%,% Language="English"?"Close":"Beenden"
IniWrite,%Language%,FileSearch.ini,Options,Language
gosub %Language%
return
}
Deutsch:
{
TextClose:="Beenden"
TextChangeLanguage:="Change to English"
TextFolder:="Ordner"
TextChooseFolder:="Bitte einen Ordner auswählen..."
TextSubFolder:="Unterordner einbeziehen"
TextSearch:="Suchen:"
TextSearchIn:="Suche im:"
TextFileName:="Datei-Name"
TextFileContent:="Datei-Inhalt"
TextRegexSearch:="RegEx-Suche"
TextFromCreated:="Vom (Erstellt)"
TextToCreated:="Bis (Erstellt)"
TextFromModified:="Vom (Modifiziert)"
TextToModified:="Bis (Modifiziert)"
TextMinSize:="Min. Größe"
TextMaxSize:="Max. Größe"
TextStartSearch:="Suche starten"
TextFoundInName:="Gefunden in Dateinamen:"
TextFoundInContent:="Gefunden im Datei-Inhalt:"
TextOpen:="Öffnen"
TextCancel:="Abbrechen"
TextSearchIsRunning:="Suche läuft"
TextSearchAborted:="Die Suche wurde abgebrochen!"
TextSearchComplete:="Die Suche ist abgeschlossen!"
gosub RefreshGui
return
}
English:
{
TextClose:="Close"
TextChangeLanguage:="Zu Deutsch wechseln"
TextFolder:="Folder"
TextChooseFolder:="Please choose a folder..."
TextSubFolder:="Include subfolders"
TextSearch:="Search:"
TextSearchIn:="Search in:"
TextFileName:="File name"
TextFileContent:="File content"
TextRegexSearch:="RegEx Search"
TextFromCreated:="From (Created)"
TextToCreated:="To (Created)"
TextFromModified:="From (Modified)"
TextToModified:="To (Modified)"
TextMinSize:="Min. size"
TextMaxSize:="Max. size"
TextStartSearch:="Start search!"
TextFoundInName:="Found in file name:"
TextFoundInContent:="Found in file content:"
TextOpen:="Open"
TextCancel:="Cancel"
TextSearchIsRunning:="Searching"
TextSearchAborted:="Search is aborted!"
TextSearchComplete:="Search is complete!"
gosub RefreshGui
return
}
RefreshGui:
{
if !Folder
GuiControl,Main:,SelectFolder,%TextChooseFolder%
GuiControl,Main:,SubFolder,%TextSubFolder%
GuiControl,Main:,TextSearch,%TextSearch%
GuiControl,Main:,TextSearchIn,%TextSearchIn%
GuiControl,Main:,CheckSearchName,%TextFileName%
GuiControl,Main:,CheckSearchContent,%TextFileContent%
GuiControl,Main:,CheckRegEx,%TextRegexSearch%
GuiControl,Main:,CheckFromCreated,%TextFromCreated%
GuiControl,Main:,CheckToCreated,%TextToCreated%
GuiControl,Main:,CheckFromModified,%TextFromModified%
GuiControl,Main:,CheckToModified,%TextToModified%
GuiControl,Main:,CheckMin,%TextMinSize%
GuiControl,Main:,CheckMax,%TextMaxSize%
GuiControl,Main:,StartSearch,%TextStartSearch%
GuiControlGet,Status,Result:
If Status { ;Gui "Result" is open
GuiControl,Result:,TextFoundInName,%TextFoundInName%
GuiControl,Result:,TextFoundInContent,%TextFoundInContent%
GuiControl,Result:,TextOpen,%TextOpen%
GuiControl,Result:,TextCancel,%TextCancel%
GuiControl,Result:,TextClose,%TextClose%
if SearchAbort
GuiControl,Result:,Status,%TextSearchAborted%
else if !IsIn(SearchIsRunning,GetTimer().names) ;timer is not active... search is complete!
GuiControl,Result:,Status,%TextSearchComplete%
}
return
}
MainGuiClose:
ExitApp
MouseOver() {
global hLBContent,hLBName
static TextBefore
MouseGetPos,,ypos
if (A_GuiControl = "LBName") {
StartRow:=LB_GETTOPINDEX(hLBName)
GuiControlGet,LBName,Pos
yPos-=26+LBNameY
ControlGet,Hits,List,,ListBox1,A
}
else if (A_GuiControl = "LBContent") {
StartRow:=LB_GETTOPINDEX(hLBContent)
GuiControlGet,LBContent,Pos
yPos-=26+LBContentY
ControlGet,Hits,List,,ListBox2,A
}
else {
TextBefore:=""
ToolTip
return
}
Row:=Ceil(yPos/18)+StartRow-1
StringSplit,Text,Hits,`n
Text:=Text%Row%
if (Text!=TextBefore)
ToolTip %Text%
TextBefore:=Text
return
}
LB_GETTOPINDEX(HWND) { ;by hd0202
; LB_GETTOPINDEX = 0x018E -> msdn.microsoft.com/en-us/library/bb761317(v=vs.85).aspx
Return (DllCall("User32.dll\SendMessage", "Ptr", HWND, "UInt", 0x018E, "Ptr", 0, "Ptr", 0, "Ptr") + 1)
}
Pause::Pause
Letzte Änderung: MouseOver eingebaut, welches bei den Suchergebnissen den Pfad im ToolTip anzeigt. Damit kann man "lange" Pfade ganz sehen. Per Doppelklick kann man nun auch eine Datei öffnen (als Alternative zum Button "öffnen").