FileSelectFolder, path, , , 选择一个文件夹 if !path ExitApp FileMenu(path) Menu, % UID(path), show ExitApp ;文件夹路径创建Menu函数 FileMenu(folder){ static FileUID := [] ;文件夹 folders := cmd("dir /AD /b /s """ folder "*""") folders .= "`n" folder ;首先建立所有menu Loop, Parse, folders, `n, `r { UID := UID(A_LoopField) FileUID[UID] := A_LoopField Menu, % UID, add, Menu, % UID, DeleteAll } ;关联上级菜单 Loop, Parse, folders, `n, `r { StringGetPos, pos, A_LoopField, , R if !Errorlevel { SplitPath, A_LoopField, path2, path1 path1UID := UID(path1) If !IsEmptyFolder(A_LoopField) Menu, % path1UID, add, % path2, % ":" UID(A_LoopField) else Menu, % path1UID, add, % path2, FileHandle Menu, % path1UID, Icon, % path2, shell32.dll, 4 } } ;文件 files := cmd("dir /A-D /b /s """ folder "*""") Loop, Parse, files, `n, `r { StringGetPos, pos, A_LoopField, , R if !Errorlevel { SplitPath, A_LoopField, path2, path1 path1UID := UID(path1) Menu, % path1UID, add, % path2, FileHandle SplitPath, A_LoopField, , , ext if !ext { Menu, % path1UID, Icon, % path2, shell32.dll, 1 continue } if (ext="exe") { try Menu, % path1UID, Icon, % path2, % A_LoopField catch e Menu, % path1UID, Icon, % path2, shell32.dll, 3 continue } if (StrLen(icon :=GetFileAssocIcon(ext))>2) { Icon := StrSplit(icon,",") try Menu, % path1UID, Icon, % path2, % Icon[1], % Icon[2] ? Icon[2] : "" catch e Menu, % path1UID, Icon, % path2, shell32.dll, 1 continue } Menu, % path1UID, Icon, % path2, shell32.dll, 1 } } ;解析句柄 修改此处决定如何处理文件 FileHandle: if A_ThisMenuItem MsgBox % FileUID[A_ThisMenu] "" A_ThisMenuItem return } UID(string) { static table := [] static id for k,v in table { if (v=string) return k } id++ table["u" id] := string return "u" id } cmd(command){ static i i++ RunWait, %ComSpec% /c %command% >%A_Temp%cmd%i%.tmp, , Hide FileRead, content, %A_Temp%cmd%i%.tmp StringReplace, content, content, `r, , All return content } IsEmptyFolder(path){ loop, %path%* return return 1 } GetFileAssocIcon(ext){ ;txt ;缓存设置 static Icons := [] ;是否缓存 if Icons[ext] return Icons[ext] else { RegRead, Name, HKCR, .%ext%, if ErrorLevel return RegRead, DefaultIcon, HKCR, %Name%DefaultIcon, if ErrorLevel return a := StrSplit(DefaultIcon,",") DefaultIcon := a[1] "," a[2]+1 Icons[ext] := DefaultIcon return DefaultIcon } }