[AHK] 用Everything增强任意程序的文件打开对话框!实现自动传递文件路径

多年以来打开文件场景,【打开/另存对话框】浏览定位文件过程常常令人恼火。Listary实现了自动将TC当前浏览目录同步到

【打开/另存对话框】,但还不能直接定位文件并传递选中文件路径。且Listary实现的步骤是5步,具体如下:

1、弹出【打开/另存对话框】

2、切换到TC界面,定位目录。

3、切回【打开/另存对话框】,自动更换了浏览的文件夹。

4、再在【打开/另存对话框】界面定位文件

5、回车确定


如何能一键  搜索定位——》同步打开 一气呵成?

方法是有的,即用Everything增强任意程序的文件打开对话框,用著名的胶水语言AHK来实现接力跑!
原理:用ahk定义热键,替换当前程序的ctrl+o功能,然后,通过ahk来调Everything定位文件后,再把Everything中选中的文件路径自动同步到打开对话框。具体实现了文件路径同步传递步骤仅3步,较上面节约2步:

1、按【Ctrl+O】 弹出Everything界面(自动同步显示了最后浏览的TC目录内容)

2、手动定位文件

3、按【空格键】确定(自动发送 Ctrl+O打开【打开/另存对话框】界面,自动将文件路径发送到对话框,自动回车确定)


 

效果如下:[AHK] 用Everything增强任意程序的文件打开对话框!实现自动传递文件路径_第1张图片


#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.
}

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(路径,打开对话框,AHK,热键,AutoHotkey)