小众介绍过的Folder Menu现在还能在哪找到?

如果仅仅只是跳转和常用文件夹的话,这个脚本也很好用。

AHK 脚本:

/*
程序: 仿Listart(By_Kawvin)
作用: ahk实现listary中的Ctrl+G打开最近目录等功能
作者: Kawvin,改自sunwind
版本: 0.1
时间: 20180301
使用方法:Ctrl+G
脚本说明:
0、ahk实现listary中的Ctrl+G打开最近目录等功能
1、获取到的当前资源管理器打开的路径
2、获取到的当前TotalCommand打开的路径
3、获取excel文档路径(可以扩展其它常用应用的文档路径)[未启用]
4、用弹出菜单展示
5、在保存/打开对话框中点击菜单项,可以更换对话框到相应路径
5、在非保存/打开对话框中点击菜单项,可以用资源管理器打开相应路径
6、点击菜单项中的xls文档路径,可以跳转到文档所在路径(其它类型的office文档都可实现,暂未开发)
7、最近使用的exe,点击可以激活
8、常用路径,点击可以打开/切换
*/
#SingleInstance,Force
;定义主要变量内容
history=A_ScriptDir\history.txt
application=A_ScriptDir\application.txt
MostUsedDir= ;最常用的路径
(Ltrim
e:\xxxxxxxx
f:\TDDOWNLOAD
)
^g:: ;Ctrl+G [Ctrl+G]运行主程序 ;{
;生成菜单
;添加菜单–目录
HKN:=0
HKStr:=“ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890”
Menu, MyMenu, Add ; 添加分隔线.
Menu, MyMenu, DeleteAll ; 清空菜单项
;获取打开的目录,并添加到dir数组
Menu, MyMenu, Add, [当前打开的路径有], MenuHandler
Menu, MyMenu, Disable, [当前打开的路径有]
;获取Explorer打开的目录,并添加到dir数组
for oExplore in ComObjCreate(“Shell.Application”).Windows
{
OutDir:=oExplore.LocationURL
if (OutDir=“”) { ;剔除 资源管理器显示的 “库” 这种情况
}else {
fileread,AllDir,history
IfNotInString,AllDir,OutDir
Log(OutDir)
HKN+=1
HKTem:=HKN<37?“&” . substr(HKStr,HKN,1) . “) “:””
MenuItem:=HKTem . OutDir
Menu, MyMenu, Add, MenuItem, MenuHandler
}
}
;获取TC打开的目录,并添加到dir数组
ifwinexist,ahk_class TTOTAL_CMD
{
;左侧
;~ Postmessage, 1075, 132, 0, ahk_class TTOTAL_CMD ;光标定位到焦点地址栏
;~ sleep 300
PostMessage,1075,2029,0,ahk_class TTOTAL_CMD ;获取路径
sleep 100
OutDir:=Clipboard
If(OutDir!=“ERROR”){ ;错误则退出
fileread,AllDir,history
IfNotInString,AllDir,OutDir
Log(OutDir)
HKN+=1
HKTem:=HKN<37?“&” . substr(HKStr,HKN,1) . “) “:””
MenuItem:=HKTem . OutDir
Menu, MyMenu, Add, MenuItem, MenuHandler
}
;右侧
;~ Postmessage, 1075, 232, 0, ahk_class TTOTAL_CMD ;光标定位到焦点地址栏
;~ sleep 300
PostMessage,1075,2030,0,ahk_class TTOTAL_CMD ;获取路径
sleep 100
OutDir:=Clipboard
If(OutDir!=“ERROR”){ ;错误则退出
fileread,AllDir,history
IfNotInString,AllDir,OutDir
Log(OutDir)
HKN+=1
HKTem:=HKN<37?“&” . substr(HKStr,HKN,1) . “) “:””
MenuItem:=HKTem . OutDir
Menu, MyMenu, Add, MenuItem, MenuHandler
}
}
Menu, MyMenu, Add ;添加分隔线
;~ ;获取已经打开的excel文档路径 ,这里可以扩展其它office文件的路径,并添加到dir数组
;~ try{
;~ oExcel := ComObjActive(“Excel.Application”)
;~ for Item in oExcel.workbooks
;~ {
;~ if (a_index=1){
;~ dir.Push(“[当前打开的xls有]”)
;~ }
;~ item:=oExcel.workbooks(A_index).FullName
;~ SplitPath,item,OutDir ;获取Excel文件路径
;~ dir.Push(OutDir)
;~ Log(OutDir)
;~ oExcel.ActiveWindow.Caption :=Item
;~ }
;~ } catch e {
;~ }
;遍历[常用路径]
Menu, MyMenu, Add, [常用路径], MenuHandler
Menu, MyMenu, Disable, [常用路径]
loop,parse,MostUsedDir,“n" { HKN+=1 HKTem:=HKN<37?"&" . substr(HKStr,HKN,1) . ") ":"" MenuItem:=HKTem . LTrim(A_LoopField) Menu, MyMenu, Add, %MenuItem%, MenuHandler } Menu, MyMenu, Add ;添加分隔线 ;读取[最近使用的路径] Menu, MyMenu, Add, [最近使用的路径], MenuHandler Menu, MyMenu, Disable, [最近使用的路径] gaopin:=getHistory(history) loop,parse,gaopin,"n”
{
StringTrimLeft, Outdir, A_LoopField, 6 ; trim左侧6个字符
if Outdir=
continue
;~ MsgBox Outdir
HKN+=1
HKTem:=HKN<37?“&” . substr(HKStr,HKN,1) . “) “:””
MenuItem:=HKTem . Outdir
Menu, MyMenu, Add, MenuItem, MenuHandler
}
Menu, MyMenu, Add ;添加分隔线
;获取[最近使用的exe]
_dir:=getExePath()
Loop,parse,_dir,n { fileread,AllApplication,%application% IfNotInString,AllApplication,%A_LoopField% Log2(A_LoopField,application) } Menu, MyMenu, Add, [最近使用的exe], MenuHandler Menu, MyMenu, Disable, [最近使用的exe] Loop,Read,%application% { if (A_index>10) break if (not ( instr(A_LoopReadLine,"explorer") OR instr(A_LoopReadLine,"CCC"))){ if (A_LoopReadLine<>""){ HKN+=1 HKTem:=HKN<37?"&" . substr(HKStr,HKN,1) . ") ":"" MenuItem:=HKTem . A_LoopReadLine Menu, MyMenu, Add, %MenuItem%, MenuHandler } } } ;~ if (InStr(item,"file:///")){ ;~ Menu, MyMenu, Add, %item%, MenuHandler ;~ }else if (InStr(item,"http")) { ;~ ;过滤掉http开头的。 ;~ }else{ ;~ Menu, MyMenu, Add, %item%, MenuHandler ;~ } ;显示菜单 Menu, MyMenu, Show return ;} MenuHandler: ;执行菜单项 ;{ if (substr(A_ThisMenuItem,1,1)="&") T_ThisMenuItem:=substr(A_ThisMenuItem,5) if (instr(T_ThisMenuItem,".exe")){ ;~ WinActivate,ahk_exe %T_ThisMenuItem% try { RunOrActivateProgram(T_ThisMenuItem) }catch{ MsgBox, 16,, 本计算机上无此程序! } }else { WinGet, this_id,ID, A WinGetTitle, this_title, ahk_id %this_id% WinGetClass,this_class,ahk_id %this_id% if(this_class="#32770") { ;保存/打开对话框 If(instr(this_title,"存") or instr(this_title,"Save") or instr(this_title,"文件")) { ChangePath(T_ThisMenuItem,this_id) }else if(instr(this_title,"开") or instr(this_title,"Open")) { ChangePath(T_ThisMenuItem,this_id) } } else { ;普通窗口 try{ OpenPath(T_ThisMenuItem) } catch e { MsgBox % "Error in " e.What ", which was called at line " e.Line "n" e.Message “n" e.Extra } } } return ;} OpenPath(_dir){ ;只是打开路径 Run,"%_dir%" } OpenAndSelect(){ } ChangePath(_dir,this_id){ WinActivate,ahk_id %this_id% ControlFocus,ReBarWindow321,ahk_id %this_id% ControlSend,ReBarWindow321,{f4},ahk_id %this_id% Loop{ ControlFocus,Edit2,ahk_id %this_id% ControlGetFocus,f,ahk_id %this_id% if A_index>50 break }until (f="Edit2") ControlSetText,edit2,%_dir%,ahk_id %this_id% ControlSend,edit2,{Enter},ahk_id %this_id% } Log(debugstr){ global FileAppend, %debugstr%n, history
return
}
Log2(debugstr,file){
FileAppend, debugstrn, %file% return } getHistory(history){ ;获取最近使用的top10路径 a := [] b = Loop, read, %history% { last_line := A_LoopReadLine ; 当循环结束时, 这里会保持最后一行的内容. if !a["" last_line] a["" last_line] := 1 else a["" last_line] += 1 } for c,d in a { d2 := SubStr("00000", 1, 5-strlen(d)) d str := d2 "_" c b .= b ? "n” str : str
}
Sort, b, R
e := StrSplit(b,“n","r”)
f =
loop 10
f .= f ? “n" e[A_index] : e[A_index] return %f% } getExePath(){ ;~ 打开当前激活窗口的exe程序所在目录 ;~ for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process") ;~ WinGet, _ProcessPath, ProcessPath, A ;~ Run,% "Explorer.exe /select, " _ProcessPath ;~ return _ProcessPath WinGet, id, list Loop, %id% { this_id := id%A_Index% WinGet, pp, ProcessPath, ahk_id %this_id% out .= pp "n”
}
;~ MsgBox, % out
return out
}
RunOrActivateProgram(Target,WinTitle=“”){
SplitPath,Target,TargetNameOnly
Process,Exist,TargetNameOnly
If ErrorLevel>0
PID=ErrorLevel
Else
Run,Target,PID
If WinTitle<>
{
SetTitleMatchMode,2
WinWait,WinTitle,3
WinActivate,WinTitle
}Else{
WinWait,ahk_pid%PID%,3
WinActivate,ahk_pid%PID%
}
Return
}
#z::ExitApp

谢谢推荐

贴的代码含中文标点会报错

原链接:

这个快捷目录的功能

目前推荐使用quicker + 插件::切换文件夹增强版

(也有别插件,很多自己选吧. 免费版也可以用这些功能.)

如果对集成 totalcommander的dir menu有需求

可以用 quick access popup (免费)

win10环境可以用listary5,

而listary6是严重开倒车的垃圾.
建议及早用quicker 和 quick access popup 替代掉.

3.5.1反而是兼容性和性能最好的版本,兼容性是WPS和Q-dir都完美支持,V5反而不行;性能不用说,直打字母快速检索是针对当前文件夹的,V5是全局的。
就是3.5.1现在有时会它自己无声自退出,也没什么出错提示,到要用其切换功能死活没反应才想起去检查它是否还在运行……

我记得Win10还是Win11,会在切换窗口报错退出,搞得我现在都不敢去触发那个情形了。
那现在这两个系统,用哪个版本合适?

我Win10 1809 LTSC
图片
用3.51除了DPI适配会让字体模糊点,和偶尔自动退出(我没试出触发机制,但不常见),都很好
图片
用过 Quickswitch ahk脚本,自己加了Q-dir适配,但因为无法应付树状目录选择框的跳转,目前无法完全替代 Listary,所以还在不断寻找

感谢分享,除了Listary降级外,看来得去学下AHK了。

源代码在这里:Folder Menu / Code / [r297] /trunk

右上角有个Download Snapshot可以下载整个包。

不过是用AutoIt3写的,不是AHK。而且我好久以前翻过它的代码,有一些对AutoIt库的魔改(就那个lib_replace目录),感觉要构建出来还不太容易

现在我弃用 Listary 了,因为旧版时不时自行退出太烦人了,新版界面又复杂了。
想换用其他文件夹跳转工具,有这些需求:

  1. 最好以菜单形式出现,不需要像 Listary 那样来回切换才跳转,而是直接在菜单上选择现正打开的文件夹,在打开/保存对话框中自动显示或热键显示;
  2. 支持识别 Q-dir 现正打开的文件夹;
  3. 现正打开的文件夹菜单项位于菜单最顶且不用子菜单打开;
  4. 可识别记录近期打开过的文件夹(例如在里面保存/打开过文件);
  5. 可添加固定文件夹(如我的文档、下载、U盘等);
  6. 菜单中列出 [4. 5.] 的菜单项或子菜单入口;
  7. 可在支持的文件管理程序中热键显示菜单并用于跳转文件夹;
  8. 可借用 Everything 跳转搜索到的文件夹或文件所在文件夹;
  9. 支持 WPS 对话框;
  10. 最好可像 Listary 那样对有子文件夹的菜单项能显示子文件夹子菜单。

目前在用的 QuickSwtich 脚本,我自己添加了 Q-dir 支持,没 [4.] 及之后的功能,在用 Jump to Folder 脚本来补充 [8.] ,但这脚本不支持在“此电脑”位置显示右键菜单项(所在位置必须至少须是一个“实”路径如“C:\”);
在试用 Runany 程序,但其没有 [2.(这最重要)7.(菜单项中的路径会用新窗口打开而不是复用所在文件管理程序窗口) 10.] 功能;
用过 QuickAssessPopup 程序,但不支持 [2. 3. 9. 10.] ;FoldersPopup 和 Folder Menu 情况类似。
如果是 QuickSwitch 的话,实现 [4. 5. 6.] 就好了,可惜作者一年多也没再进行更新;如果是程序的话最好全都能实现。核心需求是 [1.-6. 9.]。