Tablacus 可能不是最好的文件管理器,但他一定是最好的explorer的替代品。建议平时临时打开文件夹就用原生 explorer 自带的,需要持久化标签页时,就用 Tablacus !
他和explorer用的是同一套技术。列表控件和自带文件管理器相差无几。外壳则基于ie或其他浏览器引擎。
外壳和扩展都是基于HTML/js/css写的。所以他也适合喜欢调整代码的极客使用。他有很多插件扩展,是原作者漫长时间处理用户issue积累的宝库,插件本身就是学习资料。
优点1:十分小巧
加上81个扩展,小于3MB。本体只有700KB。
优点2:高度可编程
- tablacus 本体完全开源。
- 外壳都是 html/css/js
- 插件也是。插件就是学习资料。
- 这种嵌入ie的都可以用 AHK 调用com接口,分析dom或者执行任意JScript脚本。
- 据说可以更换浏览器引擎
- 据说可以在wine上运行。
优点3:与 AHK 脚本通信,运行JScript
例如:AHK中获取当前的文件选择,并复制文件名到剪贴板:(同时支持 Tablacus 以及原生 explorer 文件管理器!)
python
GroupAdd, texp_gp, ahk_exe TEd32.exe
GroupAdd, texp_gp, ahk_exe TEd64.exe
GroupAdd, texp_gp, ahk_exe explorer.exe
WBGet(hwnd, Svr:=1) { ;// based on ComObjQuery docs
msg := DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT")
IID1 := "{0002DF05-0000-0000-C000-000000000046}" ; IID_IWebBrowserApp
IID2 := "{332C4427-26CB-11D0-B483-00C04FD90119}" ; IID_IHTMLWindow2
SendMessage msg, 0, 0, Internet Explorer_Server1, ahk_id %hwnd%
if (ErrorLevel != "FAIL") {
lResult:=ErrorLevel, VarSetCapacity(GUID,16,0)
if DllCall("ole32\CLSIDFromString", "wstr","{332C4425-26CB-11D0-B483-00C04FD90119}", "ptr",&GUID) >= 0 {
DllCall("oleacc\ObjectFromLresult", "ptr",lResult, "ptr",&GUID, "ptr",0, "ptr*",pdoc)
return ComObj(9,ComObjQuery(pwb:=ComObjQuery(pdoc,IID1,IID1),IID2,IID2),1)
, ObjRelease(pdoc), ObjRelease(pwb)
}
}
}
#IfWinActive, ahk_group texp_gp
F1::
hwnd := WinExist("A")
window := WBGet(hWnd)
IfWinActive ahk_exe explorer.exe
{
Selection := Window.Document.SelectedItems
} else {
Selection := window.te.Ctrl(CTRL_FV).SelectedItems.Count
}
Path_to_Selection := ""
for Items in Selection
Path_to_Selection .= Items.path "`n"
MsgBox % Path_to_Selection
clipboard := Path_to_Selection
;消息("已复制" Selection.Count "项", "w500")
return
return
#IfWinActive
和AHk增强explorer的方式如出一辙。这种基于ie的嵌入的可以这样调用:
jsIfWinActive ahk_exe explorer.exe ; 如果是原生文件管理器! { Selection := Window.Document.SelectedItems } else { ; 否则就是 tabacus! Selection := >window.te.Ctrl(CTRL_FV).SelectedItems.Count }
其中 AHK,代码 window.te.Ctrl(CTRL_FV)
对应于Jscript,也也就是任意插件的 script.js 中te.Ctrl(CTRL_FV)
获取的就是当前的文件列表的视图控件(至于控件的方法属性,参考诸多插件即可。)。
其实,插件挂到window对象的function和变量都可以被 AHK 访问。sync.js 需要挂到 MainWindow 上面。script.js 直接挂到 window 即可。
还能直接获取返回值:(但是好像不能直接返回数组?)
js:
window.test = function(){return 1;}
ahk:
msgbox % window.test()
这种顺滑如丝跨语言调用,不知道甩Java几百条街,使得 AHK 像 python 一样成为一门极为好用的胶水语言 和强大的用户脚本引擎。