首页 > 其他分享 >[ahk]让TC 识别已经打开的路径tab,若已存在则仅激活不重复打开。

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

时间:2023-04-25 13:03:24浏览次数:36  
标签:LoopField tabs ahk InStr curline ini tab 打开 tc


#SingleInstance,force
;FileName:OpenInTC.ahk
; File encoding:  UTF-8 BOM
/*
AutoHotkey 版本: 1.1.9.0
操作系统:    Windows XP/Vista/7
作者:        sunwind 

设计目的:[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

标签:LoopField,tabs,ahk,InStr,curline,ini,tab,打开,tc
From: https://blog.51cto.com/u_15408625/6223777

相关文章

  • 用热键win+字母激活任务栏上的按钮[ahk]
    ;bug:热键请自行修改,发现按win+dwin+l等和系统热键冲突,可以改成空格键或Capslock键+字母;Fileencoding:UTF-8AutoHotkey版本:1.0.9.1操作系统:WindowsXP脚本说明:QuicktaskswitchingwithWin+[a,b,...,z]脚本版本:v1.0Timestamp:2012-12-2014:12:56*......
  • [ahk]右键菜单打开文件所在文件夹(快捷方式也适用)
    功能:能打开文件所在路径并定位到文件上,能正确解析lnk所指文件的目录。 copypath.ahk 文件如下: #NoTrayIconClipboard=%1% openpath.ahk文件如下:#NoTrayIconClipboard=%1%Run,%"Explorer.exe/select,"Clipboard说明一:剪贴板内容被置为文件路径了。说明二:需要注册到......
  • [AHK]热键获取TC当前的路径
    原创部分:热键alt+shif+c复制当前tc窗口中的路径。#IfWinActiveahk_classTTOTAL_CMD!+c::PostMessage1075,2029,0,,ahk_classTTOTAL_CMD;复制完整路径return#IfWinActive2010年04月11日星期日17:07一故事的开始,寻找TotalCommander(以下简称TC)的快捷键--“在下已经严重鼠......
  • 用自己指定的模板创建ahk脚本
    在windows右键弹出菜单的新建菜单中加入“AutoHotkey脚本” 1.首先写好模板文件,随便保存在一个地方,比如我是“X:\AutoHotkey\AutoHotkey\SHELLNEW\Template.ahk”;2.打开注册表(regedit),找到[HKEY_CLASSES_ROOT]->[.ahk](没有的话,自己新建项.ahk);3.在[.ahk]下新建项[ShellN......
  • [ahk]获取文华财经全自动运行模组信号记录
    #Persistent#SingleInstanceForceDetectHiddenWindows,OnControl:="SysListView323"WinTitle:="全自动运行模组ahk_class#32770"WinText:="List1"ControlClick,Button26,%WinTitle% ControlGet,......
  • [AHK]倒计时牌(高考还有多少天这类的)
    ;DaysLeft.ahk;Authorsnwind/*[config]DateTarget=20151204000000DateFrom=20151106000000*/;~#SingleInstance,force;~ListLines,OnFormatTime,today,,yyyyMMddIniRead,DateTarget,%A_ScriptFullPath%,config,DateTarge......
  • [ahk]读取excel文件实例
    EXCEL内容如下:AutoHotkey代码如下:#Persistent#SingleInstance,force;2015年1月4日;sunwind;读取excel实例excel:=ComObjActive("Excel.Application")filepath:=A_ScriptDir."\循环读取.xlsx";自动运行、初始化Runnotepadxls:=Check(fil......
  • [AHK]精确计时到秒
    DllCall("QueryPerformanceFrequency","Int64*",QuadPart)DllCall("QueryPerformanceCounter","Int64*",CounterBefore)Sleep1000DllCall("QueryPerformanceCounter","Int64*",CounterAfter)MsgBox%......
  • 【ahk】为QQ增加激活主面板的热键
    本脚本只是实现了热键激活不在前台的QQ主面板,并不是热键打开主面板。使用方法:先手动打开QQ主面板,并且不要最小化,然后运行本脚本,此脚本会探测到主面板的id,然后绑定热键win+z来用于激活动作。/*为QQ增加热键这个脚本前提是,你要激活的窗口需要事先打开的(且主面板不能最小化)。然后......
  • [AHK]为通达信增加打开关闭交易窗口的功能热键
    用文华财经习惯用空格呼叫出交易界面,通达信软件(招商证券)没有相应热键,便用AutoHotkey来帮它定义一个。#Persistent#SingleInstanceForceControl:="AfxWnd424"#IfWinActiveahk_classTdxW_MainFrame_ClassSpace::ControlClick,%Control%,,,,,NA#If华泰是426......