AutoHotkey: From FileSync open another TC instance with selected files

From TotalcmdWiki
Revision as of 18:50, 6 August 2017 by StatusQuo (talk | contribs) (date)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
		; ////////////////////////////////////////////////////////////////////////////
		; // TC_Sync_OpenFolderInSecondTC.ahk  V0.21  (W) StatusQuo 2008 - 2017
		; // http://ghisler.ch/board/viewtopic.php?t=19713
		; // 
		; // open another TC instance
		; // with the folders of the currently selected file in cm_FileSync
		; // via hotkey: Ctrl+Win+T
		; ////////////////////////////////////////////////////////////////////////////

#SingleInstance, Force
Return

#IfWinActive, ahk_class TCmpForm
; F4::
^#t::	; hotkey =  Ctrl+Win+T
		; please adjust path here; %COMMANDER_PATH% is not available outside of TC
	sTCExe := "C:\totalcmd\TOTALCMD.EXE"
	boAlwaysOpenNewTask := 0	; set to 1 to not re-use TC target window (always open a new one)
	boCdToFolderOnly    := 0	; set to 0 to have cursor placed on selected files; uses Lister (experimental?)
	iListerTimeOutSecs  := 1	; if using Lister: timeout after n seconds of not appearing Lister
	TCSync2nd_RunAsAdmin := 0	; set to 1 to start 2nd TC as other user, e.g. administrator
	; static pidTC2
	;
	LB_GETCARETINDEX := 0x019F
	LB_GETTEXT := 0x0189
	ControlGetFocus, Panel_id
	SendMessage, %LB_GETCARETINDEX%, 0, 0, %Panel_id%
	LB_CursorPosition := ErrorLevel
	VarSetCapacity(LB_String, 1024, 0)
	SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id%
	LB_CursorLine := LB_String
	Loop	; *** find subdirectory	*** only working for VISIBLE lines - after scrolling dir line out of view, LB_GETTEXT fails! (Win2k, TC8.51a)
	{
		If (SubStr(LB_String, StrLen(LB_String)) = "\")
		or (LB_CursorPosition < 0)
			Break
		SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id%
		LB_CursorPosition -= 1
	}
	; LB_SubDir := LB_String	; moved down
	ControlGetText, sLPath, TEdit2, ahk_class TCmpForm	; TC <= 7.04a
	ControlGetText, sRPath, TEdit1, ahk_class TCmpForm
	boTC75 := 0	; TC <= 7.04a
	if (sLPath . sRPath = "")
	{
		ControlGetText, sLPath, TAltEdit2, ahk_class TCmpForm	; TC >= 7.50 rc1
		ControlGetText, sRPath, TAltEdit1, ahk_class TCmpForm
		if (sLPath . sRPath != "")
			boTC75 := 1	; TC >= TC 7.50 rc1
	}
	if (boTC75)	; TC >= TC 7.50 rc1
	{
		if (SubStr(LB_String, 1, 7) = "DIR EQ ")
			LB_String := SubStr(LB_String, 8)
		if (SubStr(LB_String, 1, 8) = "DIR DEL ")
			LB_String := SubStr(LB_String, 9)
		if (SubStr(LB_String, 1, 11) = "DIR L to R ")
			LB_String := SubStr(LB_String, 12)
		if (SubStr(LB_String, 1, 11) = "DIR R to L ")
			LB_String := SubStr(LB_String, 12)
	}
	;
	LB_SubDir := LB_String
	;
		; *** TC 8.51a:
		; *** LB_CursorLine =     "2 EQ FILE.EXT 123.456 01.02.12 11:22:33 | 01.02.12 11:22:33 123.456 FILE.EXT"
		; *** LB_CursorLine =                                   "R R to L  | 01.02.12 11:22:33 123.456 FILE.EXT"
		; *** LB_CursorLine = "L L to R FILE.EXT 123.456 01.02.12 11:22:33 |"
	sLDirName := ""	; *** get left path name
	if (not boCdToFolderOnly)
	and (SubStr(LB_CursorLine, 1, 1) != "R")	; and (SubStr(LB_CursorLine, StrLen(LB_CursorLine), 1) != "\")
	{
		Send, {F3}
		sLDirName := GetActiveTCListerPath()
	}
	If (sLDirName = "")
		sLDirName := sLPath . LB_SubDir
	; ---
	sRDirName := ""	; *** get right path name
	if (not boCdToFolderOnly)
	and (SubStr(LB_CursorLine, 1, 1) != "L")	; and (SubStr(LB_CursorLine, StrLen(LB_CursorLine), 1) != "\")
	{
		Send, +{F3}
		sRDirName := GetActiveTCListerPath()
	}
	If (sRDirName = "")
		sRDirName := sRPath . LB_SubDir
	; ---
	If boAlwaysOpenNewTask
	or (not WinExist("ahk_pid " . pidTC2))
		pidTC2 := ""
	if not (pidTC2 = "")
	{
		WinActivate, ahk_pid %pidTC2%
		sTCExe = %sTCExe% /O
	}
	;
	sRunStr := sTCExe
	if (sLDirName != "")
		sRunStr = %sRunStr% /A /L="%sLDirName%"
	if (sRDirName != "")
		sRunStr = %sRunStr% /A /R="%sRDirName%"
	if (sRunStr = sTCExe)
		Return
	if (pidTC2 = "")
	{
		if (TCSync2nd_RunAsAdmin > "0")
		{
				; -- run as admin: also workaround for TC "As Administrator" bug up to TC 7.50 pubbeta 2
			sRunUser := ""
			sRunPw := ""
			InputBox, sRunUser, TC RunAs: Enter Administrator user name, Logon user name (Administrator):,,, 120,,,,, Administrator
			if ErrorLevel
				sRunUser := ""
			if (sRunUser != "")
				InputBox, sRunPw  , TC RunAs: Enter Administrator password,  Logon password for "%sRunUser%":,,, 120
			if ErrorLevel
				sRunUser := ""
			if (sRunUser != "")
				RunAs, %sRunUser%, %sRunPw%
			if ErrorLevel
				sRunUser := ""
		}
		;
		Run, %sRunStr%,,, pidTC2
		RunAs
	}
	else
	{
		Run, %sRunStr%
	}
	;
	Return

#IfWinActive

; =============
; === TC Lister: grab path/file names of file in active lister window
GetActiveTCListerPath()
{
	global boCdToFolderOnly, iListerTimeOutSecs
	WinWaitNotActive, ahk_class TCmpForm,, %iListerTimeOutSecs%	; wait for starting lister, timeout in seconds, set in hotkey (^#t)
	IfWinActive, ahk_class TCmpForm	; Lister hasn't started - no file on this panel side?
		Return
	SetTitleMatchMode, 1
	IfWinActive, Lister
	{
		WinGetActiveTitle, sWinTitle
		WinClose, %sWinTitle%
		Loop, 10	; *** for big files: wait until load+close is done
		{
			If !WinExist( sWinTitle )
				Break
			Sleep, 300
		}
	}
	; iNamePos := (InStr(sWinTitle, "[", false, 0) + 1)	; old (fails using [] in FN)
	iNamePos := (InStr(sWinTitle, "[", false, 1) + 1)
	iNameEnd := (InStr(sWinTitle, "]", false, 0) - 1)	; *** InStr start=0: search in reverse
	If (boCdToFolderOnly)	; folder only
	{
		sReturn := SubStr(sWinTitle, iNamePos, (InStr(sWinTitle, "\", false, 0) + 1) - iNamePos)	; *** InStr start=0: search in reverse
	} else {	; folder + file name
		;sReturn := SubStr(sWinTitle, iNamePos, StrLen(sWinTitle) - iNamePos)	; *** 2do: fails on MP3 (Lister opened w/ option Multimedia)
		sReturn := SubStr(sWinTitle, iNamePos, iNameEnd - iNamePos + 1)	; *** _[123abc] 8 - 3	; 	; *** fixed multimedia viewer mode (universal: terminate at last "]")
	}
	Return, %sReturn%
}
/*

;

Back to AutoHotkey