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

时间:2021-10-26 19:17:27
#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