#SingleInstance,force ;FileName:OpenInTC.ahk ; File encoding: UTF-8 BOM /* AutoHotkey 版本: 1.1.9.0 操作系统: Windows XP/Vista/7 作者: sunwind <1576157@qq.com> 博客: http://blog.csdn.net/liuyukuan 设计目的:[ahk]让TC 识别已经打开的路径tab,若已存在则仅激活不重复打开。 设计思路:先保存当前配置,再检测其是否存在要打开的标签 功能: 1.新开tab标签如果已存在则激活,若不存在则打开之 2.按住shift 右侧窗口激活,不按左侧 3.接收路径以参数形式传给本脚本,可以为candy等工具调用 在candy的配置中设置菜单项: 在tc中打开 =cango|openWithTC|"{file:pathfull}" 4.兼容路径 末尾无\ 的情况 5.兼容带空格路径 6.兼容wincmd.ini中RedirectSection的情况 7.修正最小化在托盘中时激活的bug 形如[Left] RedirectSection=%COMMANDER_PATH%\USER\user.ini 若把本脚本放到TOTALCMD.EXE所在目录则免配置 否则,可以以命令行参数指定wincmd.ini路径,不指定则需要配置本脚本的tc_exe 脚本版本: v1.7 时间戳:20130227 0:15:47 */ SetWorkingDir %A_ScriptDir% DetectHiddenWindows,on tc_exe=M:\Total Commander\TOTALCMD.EXE wincmd_ini=M:\Total Commander\WINCMD.INI OutputDebug %1% SplitPath,tc_exe,,tc_dir GetKeyState, state, Shift ;state=D Shift key is down.用右侧打开 ;state=U Shift key is Up.用左侧打开 ;用特殊的0变量判断,调用者所传过来的需要打开的路径 If 0 > 0 { targetPath=%1% } Else { targetPath=%tc_dir% } If (SubStr(Trim(targetPath),0)!="`\") targetPath.="`\" ;检验配置并得到正确的tabs信息存储位置 tabs_ini:=getTabs_ini(tc_exe,wincmd_ini) OutputDebug, %tabs_ini% IfExist,%tabs_ini% { Loop,10 { sendTCCommand(580,1 ) ;保存配置,582保存文件夹历史记录 Sleep,200 }until (checkTime(tabs_ini)) } Else { MsgBox,,请修改配置文件,%wincmd_ini%中的`nRedirectSection=路径存在错误 ExitApp } isFinded=-1 If state = D ;在右侧检测 { rightArray:=getRightArray(tabs_ini) ;必须用:=不能用用= printArray(RightArray) for index, element in rightArray { If targetPath=%element% { isFinded=2 TargetNum:=5300+index+1 OutputDebug,在右侧检测到%element%,激活%TargetNum% } } } Else { leftArray:=getLeftArray(tabs_ini) printArray(leftArray) for index, element in leftArray { If targetPath=%element% { isFinded=1 TargetNum:=5200+index+1 OutputDebug,在左侧检测到%element%,激活%TargetNum% } } } If isFinded>0 { OutputDebug,isFinded=%isFinded% 找到激活之 activeTC(tc_exe,TargetNum) } Else { OutputDebug,isFinded=%isFinded% 未找到打开之 If state = D ;在右侧打开 tc_cmd=`"%tc_exe%`" /O /T /R=`"%targetPath%`" Else tc_cmd=`"%tc_exe%`" /O /T /L=`"%targetPath%`" Run %tc_cmd% } Return getLeftArray(tabs_ini) { LeftActiveTab= IniRead, LeftActiveTab_Section, %tabs_ini%, left Loop, Parse, LeftActiveTab_Section, `n, `r ;%a_tab%%a_Space%`r { curline := Trim(A_LoopField) If (InStr(curline,"path")) { p:= InStr(A_LoopField, "=") LeftActiveTab := SubStr(A_LoopField, p + 1) Break } } IniRead, lefttabs_Section, %tabs_ini%, lefttabs LeftHas:=-1 LeftActiveTabNum:=-1 leftArray := Object() printlog= Loop, Parse, lefttabs_Section, `n, `r { curline := Trim(A_LoopField) If (InStr(curline,"_path"))||(InStr(curline,"activetab")) { match1 := SubStr(A_LoopField, (p1:=InStr(A_LoopField, "_"))+1, (p2:= InStr(A_LoopField, "="))-p1-1 ) match2 := SubStr(A_LoopField, p2 + 1) If (match1="path") ;必须有括号括起 { LeftHas++ leftArray[LeftHas]:=match2 } Else { LeftActiveTabNum:=match2 } } } leftArray.Insert(LeftActiveTabNum,LeftActiveTab) Return leftArray } getRightArray(tabs_ini) { RightActiveTab= IniRead,RightActiveTab_Section, %tabs_ini%, Right Loop, Parse, RightActiveTab_Section, `n, `r ;%a_tab%%a_Space%`r { curline := Trim(A_LoopField) If (InStr(curline,"path")) { p:= InStr(A_LoopField, "=") RightActiveTab := SubStr(A_LoopField, p + 1) Break } } IniRead, Righttabs_Section, %tabs_ini%, Righttabs RightHas:=-1 RightActiveTabNum:=-1 RightArray := Object() printlog= Loop, Parse, Righttabs_Section, `n, `r { curline := Trim(A_LoopField) If (InStr(curline,"_path"))||(InStr(curline,"activetab")) { match1 := SubStr(A_LoopField, (p1:=InStr(A_LoopField, "_"))+1, (p2:= InStr(A_LoopField, "="))-p1-1 ) match2 := SubStr(A_LoopField, p2 + 1) If (match1="path") ;必须有括号括起 { RightHas++ RightArray[RightHas]:=match2 } Else { RightActiveTabNum:=match2 } } } RightArray.Insert(RightActiveTabNum,RightActiveTab) Return RightArray } checkTime(tabs_ini) { static LogTime test:=LogTime FileGetTime, newLogTime,%tabs_ini% LogTime:=newLogTime OutputDebug,探测TC标签信息:`n上一个快照%test%`n当前快照%LogTime% If (newLogTime!=test) Return True Else Return false } sendTCCommand( CommandID, xbWait=1 ) { If (xbWait) SendMessage 1075, %CommandID%, 0, , ahk_class TTOTAL_CMD Else PostMessage 1075, %CommandID%, 0, , ahk_class TTOTAL_CMD } getTabs_ini(ByRef tc_exe,ByRef wincmd_ini) { ;参考流彩写的函数,首先默认脚本目录下的tc IfExist,TOTALCMD.EXE tc_exe=%A_WorkingDir%\TOTALCMD.EXE Else { IfNotExist, %tc_exe% { MsgBox 请直接配置tc_exe变量为tc全路径 ExitApp } } SplitPath,tc_exe,,COMMANDER_PATH ;用于 COMMANDER_PATH IfExist,WINCMD.INI wincmd_ini=%A_WorkingDir%\WINCMD.INI Else { IfNotExist, %wincmd_ini% { MsgBox,请直接配置wincmd_ini变量为tc配置文件的全路径 ExitApp } } IniRead, Test_Left_Section, %wincmd_ini%, left If InStr(Test_Left_Section,"RedirectSection") { Loop, Parse, Test_Left_Section, `n, `r { curline := Trim(A_LoopField) If (InStr(curline,"RedirectSection")) { isRedirectSection=1 redirect_ini := SubStr(A_LoopField, InStr(A_LoopField, "=") + 1) StringReplace,tabs_ini,redirect_ini,`%COMMANDER_PATH`%,%COMMANDER_PATH% } } } Else tabs_ini:=wincmd_ini Return tabs_ini } activeTC(tc_exe, TargetNum) { IfWinExist, ahk_class TTOTAL_CMD WinActivate else { Run,%tc_exe% /O WinWait, AHK_CLASS TTOTAL_CMD } PostMessage 1075, %TargetNum%, 0, , AHK_CLASS TTOTAL_CMD ;ActiveTab } printArray(Array) { for index, element in Array { printlog.=index . "_path is " . element . "`n" } OutputDebug %printlog% }
在everything找到一个文件/文件夹时,按ctrl+enter能调用这个脚本吗?
答:只需要把:Everything.ini中的下列配置改好即可
open_folder_path_command=$exec("X:\ahk\cango\Cango_openWithTC.ahk" "$parent(%1)")
注意:先关闭Everything,再修改它的ini文件这里的路径修改成你openWithTC.ahk所在的路径(路径中不能有中文)
另外,openWithTC.ahk最好放到TC的目录中这样可以免去配置openWithTC
否则要配置脚本中的两个变量:
tc_exe=M:\Total Commander\TOTALCMD.EXE
wincmd_ini=M:\Total Commander\WINCMD.INI