多年以来打开文件场景,【打开/另存对话框】浏览定位文件过程常常令人恼火。Listary实现了自动将TC当前浏览目录同步到
【打开/另存对话框】,但还不能直接定位文件并传递选中文件路径。且Listary实现的步骤是5步,具体如下:
方法是有的,即用Everything增强任意程序的文件打开对话框,用著名的胶水语言AHK来实现接力跑!
原理:用ahk定义热键,替换当前程序的ctrl+o功能,然后,通过ahk来调Everything定位文件后,再把Everything中选中的文件路径自动同步到打开对话框。具体实现了文件路径同步传递步骤仅3步,较上面节约2步:
#Persistent
#SingleInstance,force
/*
作者:sunwind
发布0:2019年10月10日22:45:05
更新1:2019年10月11日17:00:18 兼容无TC情况,支持获取资源管理器当前打开目录。
更新2:2019年10月11日21:34:18 完善微软Word的支持。
更新3:2019年10月11日22:00:55 支持获取Doups当前打开目录。
更新4:2019年10月12日20:46:19 支持选择多个文件同时打开。
更新5:2019年10月13日09:16:40 支持根据当前程序不同而用Everything过滤不同类型文件,比如当前程序是Word,那么启动Everything是只显示doc文档。
更新6:2019年10月14日11:37:20 增加对已打开对话框情况的支持。按ctr+o则自动把打开对话况路径置为最后浏览的目录。
最新版本地址:https://blog.csdn.net/liuyukuan/article/details/102492464
功能:劫持当前程序的Ctrl+O热键,用Everything搜索定位文件后,按空格后立即用当前程序打开。
用法:
1、配置ev变量为你本机Everything.exe的路径
2、在某程序中按ctrl+O
3、弹出Everything窗口(默认会以TC、DO或资源管理器最后浏览的目录作为搜索的起始目录)
4、手动输入要搜索的关键字
5、鼠标或上下键移动 ,选中待打开文件(支持多选)
6、按空格键即完成 (关闭everything、弹出打开对话框、发送文件路径、发送Enter键)
7、支持对不同程序设置文件类型的过滤规则。
*/
;请自行配置everything目录
ev:="D:\Everything\Everything.exe"
^+r::reload
^+e::edit
^+q::QuoteSelection() ; Ctrl+Shift+Q
$^o::
WinGetClass, class, A
WinGetActiveTitle, title
WinGet,this_exe,ProcessName, A
WinGetActiveTitle,title
OutputDebug,来源程序->%this_exe% `n title->%title% `n title->%title% `n class->%class%
folder:=""
IfWinExist,ahk_class TTOTAL_CMD
{
folder:=getTcFolder()
}
IfWinExist,ahk_exe dopus.exe
{
folder:=getDopusFolder()
}
else
{
folder:=getExploreFolder()
}
;如当前就是对话框情形,按ctrl+o则同步已打开路径。
If (Title ~= "Open") OR (Title ~= "Save As") OR (Title ~= "打开") OR (Title ~= "另存为") or (Title ~= "保存附件") OR (Title ~= "Select document to open")
{
SendEvent ^a
SendInput {Blind}{Text}%folder%
SendInput {Enter}
}
;如当前不是对话框情形,按ctrl+o则先打开everything,再打开对话框。
else
{
if (folder)
{
Run %ev% -p `"%folder%`"
}
else
Run %ev%
WinWaitActive ahk_exe Everything.exe, , 2
if ErrorLevel
{
MsgBox, WinWait timed out.
return
}
else
{
ControlFocus,Edit1,ahk_exe Everything.exe
;以下是规则配置区,根据不同程序向everything输出不同过滤规则
;---------------------------------------------
if (this_exe="WINWORD.EXE")
{
OutputDebug,设置过滤,为了->%this_exe%
setFilter("*.doc | *.docx ")
}
if (this_exe="EXCEL.EXE")
{
OutputDebug,设置过滤,为了->%this_exe%
setFilter("*.xls | *.xlsx ")
}
if (this_exe="POWERPNT.EXE")
{
OutputDebug,设置过滤,为了->%this_exe%
setFilter("*.ppt | *.pptx ")
}
if (this_exe="iThoughts.exe")
{
OutputDebug,设置过滤,为了->%this_exe%
setFilter(".itmz | .mm | .xmind ")
}
if this_exe contains notepad,scite
{
OutputDebug,设置过滤,为了->%this_exe%
setFilter(".txt | .ini | .ahk | .py | .ahkl ")
}
;---------------------------------------------
;以上是规则配置区
}
}
Return
setFilter(str)
{
sendinput {text} %str%
send {Space}
send {Enter}
}
open:
;方案1:直接用run来运行
;~ run %file%
;方案2:发送真正的ctrl+o热键,弹出打开对话框,发送文件路径。
;WinActivate,ahk_class %class%
WinActivate,ahk_exe %this_exe%
OutputDebug,激活ahk_exe-->%this_exe%
WinWaitActive, ahk_exe %this_exe%, , 2
if ErrorLevel
{
MsgBox, WinWait timed out.
return
}
else
{
SendEvent ^o
Sleep,200
SendEvent ^a
SendInput {Blind}{Text}%file%
SendInput {Enter}
ToolTip
}
Return
#IfWinActive ahk_class EVERYTHING
;在Everything界面中手动选择文件,然后按空格键完成:关闭ev,跳转到Open代码段。
~Space::
;获取everything中选中的文件
file:=getFile()
;~ 判断文件是否为.lnk类型
;~ SplitPath,file,,,ext
;~ if (ext = "lnk")
;~ {
;~ FileGetShortcut, %file%, file
;~ }
;如果获取了文件则,处理打开对话框,否则只发送空格。
if (file)
{
OutputDebug,获取everything中选中的文件File->%File%
Gosub open
}
else
{
Traytip 未选择文件!
send {Space}
}
#If
;从Total Commander 获取当前浏览的目录
getTcFolder()
{
;需要运行Total Commander
ClipSaved := ClipboardAll
clipboard =
SendMessage 1075, 2029, 0, , ahk_class TTOTAL_CMD ;2029 复制来源路径
ClipWait,2
OutDir=%clipboard%
Clipboard := ClipSaved
ClipSaved =
Return OutDir
}
;从资源管理器获取当前浏览的目录
getExploreFolder(hWnd=0)
{
; If hWnd || (hWnd := WinExist("ahk_class (?:Cabinet|Explore)WClass")) ; SetTitleMatchMode, RegEx
If hWnd || (hWnd := WinExist("ahk_class CabinetWClass")) || (hWnd := WinExist("ahk_class ExploreWClass"))
{
For window in ComObjCreate("Shell.Application").Windows
doc := window.Document
Until (window.hWnd = hWnd)
}
sFolder:= doc.folder.self.path
Return sFolder
}
;从Dopus获取当前浏览的目录
getDopusFolder(){
ControlGetText,folder, Edit1,ahk_class dopus.lister
;~ folder:=StrReplace(folder,"地址:","")
IfInString folder, :\
{
Return %folder%
}
else
{
Return ""
}
}
;从Everything获取当前选中的文件
getFile()
{
SelectionFile:=GetSelection()
if (StrSplit(SelectionFile,"`r`n").MaxIndex()=1)
{
Return RegExReplace(SelectionFile,"`r`n","")
}
else
{
SelectionFile:=arrJoin(StrSplit(SelectionFile,"`r`n"),A_Space)
Return SelectionFile
}
;~ ControlGet, SelectedItems, List, Selected, SysListView321, ahk_class EVERYTHING
;~ lines:=StrSplit(SelectedItems,"`n")
;~ Loop % lines.MaxIndex()
;~ {
;~ this_file :=StrSplit(lines[A_Index],A_Tab)
;~ MsgBox % arrJoin(this_file,"★")
;~ OutputDebug %A_Index%->%this_file%
;~ }
;~ return
}
;数组元素拼接
arrJoin(this, sep="|")
{
For idx,item in this
{
str .= (!str ? "" : sep) Quote(item) ;技巧:每个元素前面增加分隔离符号
}
return str
}
GetSelection(timeoutSeconds:= 0.5)
{
ClipSaved := ClipboardAll
Clipboard:= ; Clear clipboard for ClipWait to function.
Send ^c ; Send Ctrl+C to get selection on clipboard.
ClipWait %timeoutSeconds% ; Wait for the copied text to arrive at the clipboard.
OutVar=%Clipboard%
Clipboard := ClipSaved
ClipSaved =
return OutVar
}
;为字符串前后增加"
Quote(s)
{
return """" . s . """"
}
;用引号把选中的字符串括起来
QuoteSelection()
{
selection:= GetSelection() ; Get selected text.
PasteText(Quote(selection)) ; Quote the text and paste it back.
}
PasteText(s)
{
Clipboard:=s ; Put the text on the clipboard.
Send ^v ; Paste the text with Ctrl+V.
}