首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

[ahk]让TC 判别已经打开的路径tab,若已存在则仅激活不重复打开

2013-02-28 
[ahk]让TC 识别已经打开的路径tab,若已存在则仅激活不重复打开。#SingleInstance,forceFileName:OpenInTC.

[ahk]让TC 识别已经打开的路径tab,若已存在则仅激活不重复打开。

#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,ontc_exe=M:\Total Commander\TOTALCMD.EXEwincmd_ini=M:\Total Commander\WINCMD.INIOutputDebug %1%SplitPath,tc_exe,,tc_dirGetKeyState, 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=-1If 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%  }ReturngetLeftArray(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

2楼neaby昨天 11:13
收藏了吧,楼主真是一个追求完美,善于分享的人,赞一个!
Re: liuyukuan昨天 12:57
回复neabyn谢谢你的支持
1楼liuyukuan昨天 10:23
可以把shift检测改成CapsLock,或者ScrollLocknGetKeyState, state, CapsLock,Tnn当灯亮时,是在TC右侧打开tab,否则是在TC左侧打开tab

热点排行