SendMessage to Totoal Commander [AHK V2]

Post your working scripts, libraries and tools.
valuex
Posts: 86
Joined: 01 Nov 2014, 08:17

SendMessage to Totoal Commander [AHK V2]

08 Jan 2024, 09:45

1. Send TC internal command
One should check the coresponding CommandCodeNumber in TotalCMD.inc.
Then

Code: Select all

;SendMessage( 1075, CommandCodeNumber , 0, , "ahk_class TTOTAL_CMD") 
SendMessage( 1075, 2912, 0, , "ahk_class TTOTAL_CMD")  ;cm_CopyFullNamesToClip
; or
;PostMessage( 1075, CommandCodeNumber , 0, , "ahk_class TTOTAL_CMD") 
PostMessage( 1075, 2912, 0, , "ahk_class TTOTAL_CMD")  ;cm_CopyFullNamesToClip
valuex
Posts: 86
Joined: 01 Nov 2014, 08:17

Re: SendMessage to Totoal Commander [AHK V2]

08 Jan 2024, 09:48

2. Send user defined command
First go to TC_dir\usercmd.ini to define your command like this.

Code: Select all

[em_navigatetodir]
cmd=CD
param=D:\
Then call the below function

Code: Select all

TC_SendUserCommand("em_navigatetodir")
TC_SendUserCommand(userCommand) 
{
    ; https://www.autohotkey.com/boards/viewtopic.php?p=538463&sid=4471e03917209854441ac07ebdc70901#p538463
    static dwData := 19781  ;Ord("E") +256*Ord("M")
    static WM_COPYDATA := 0x4A
    cbData := Buffer(StrPut(userCommand, 'CP0'))
    StrPut(userCommand, cbData, 'CP0')
    COPYDATASTRUCT := Buffer(A_PtrSize * 3)
    NumPut('Ptr', dwData, 'Ptr', cbData.size, 'Ptr', cbData.ptr, COPYDATASTRUCT)
    MsgResult:=SendMessage( WM_COPYDATA,, COPYDATASTRUCT,, 'ahk_class TTOTAL_CMD')
    return MsgResult
}
valuex
Posts: 86
Joined: 01 Nov 2014, 08:17

Re: SendMessage to Totoal Commander [AHK V2]

08 Jan 2024, 09:51

3. Send Commands with Parameters
! Only tested for CD now.

With below script, one can set path in TC left or right tab.

Code: Select all

;https://www.ghisler.ch/board/viewtopic.php?p=277574#256573
/*
The complete syntax is in fact : 
<Left>`r<Right>\0                       ; eg:  D:\xxx\   `r  E:\xxx\  \0
<Source>`r<Target>\0S                   ; eg:  D:\xxx\   `r  E:\xxx\  \0
<Left>`r<Right>\0T open in new Tab      ; eg:  D:\xxx\   `r  E:\xxx\  \0T
*/
TC_SetLeftPath(inpath) 
{
    ; inpath should be ended with \
    newPath:=inpath . "`r"
    TC_SetPath(newPath) 
}
TC_SetRightPath(inpath)
{
    ; inpath should be ended with \
    newPath:="`r" . inpath . "\0"
    TC_SetPath(newPath) 
}
TC_SetPath(userCommand) 
{
    ; https://www.autohotkey.com/boards/viewtopic.php?p=538463&sid=4471e03917209854441ac07ebdc70901#p538463
    static dwData := 17475  ;;Ord("C") +256*Ord("D")
    static WM_COPYDATA := 0x4A
    cbData := Buffer(StrPut(userCommand, 'CP0'))
    StrPut(userCommand, cbData, 'CP0')
    COPYDATASTRUCT := Buffer(A_PtrSize * 3)
    NumPut('Ptr', dwData, 'Ptr', cbData.size, 'Ptr', cbData.ptr, COPYDATASTRUCT)
    MsgResult:=SendMessage( WM_COPYDATA,, COPYDATASTRUCT,, 'ahk_class TTOTAL_CMD')
    return MsgResult
}
valuex
Posts: 86
Joined: 01 Nov 2014, 08:17

Re: SendMessage to Totoal Commander [AHK V2]

08 Jan 2024, 11:05

4. Get the response from TC by Receive Receive_WM_COPYDATA

Code: Select all

AcSide:=TC_GetActiveSide()
MsgBox AcSide

TC_GetActiveSide()
{
    ;https://wincmd.ru/forum/viewtopic.php?p=110848&sid=0dfde01723b39e508e96d62c00a7a9b5
    If WinExist("ahk_class TTOTAL_CMD") ;&& WinActive("ahk_class TTOTAL_CMD")
    {
        OnMessage(0x4a, TC_Receive_WM_COPYDATA)  ; 0x4a is WM_COPYDATA
        TC_Send_WM_COPYDATA(cmd:="A")
        return retVal
    }
    else
        return "TC does NOT exist"
}

TC_Send_WM_COPYDATA(cmd){
    
    Critical
    if(!RegExMatch(cmd, "^(A|[LRST][PCIN]?)$"))
        return
    static dwData:=Ord("G") + 256 * Ord("W")
    static WM_COPYDATA := 0x4A
    cbData := Buffer(StrPut(cmd, 'CP0'))
    StrPut(cmd, cbData, 'CP0')
    CopyDataStruct:=Buffer(A_PtrSize * 3)
    NumPut('Ptr', dwData, 'Ptr', cbData.size, 'Ptr', cbData.ptr, COPYDATASTRUCT)
    MsgResult:=SendMessage(WM_COPYDATA, A_ScriptHwnd, CopyDataStruct, , "ahk_class TTOTAL_CMD")
    return MsgResult
}

TC_Receive_WM_COPYDATA(wParam, lParam, msg, hwnd)
{
  global retVal
  PtrPos:=NumGet(lParam + A_PtrSize * 2,0,"Ptr")
  retVal:=StrGet(PtrPos)
  return 1
}
valuex
Posts: 86
Joined: 01 Nov 2014, 08:17

Re: SendMessage to Totoal Commander [AHK V2]

08 Jan 2024, 11:07

occupied for future 1 :D
valuex
Posts: 86
Joined: 01 Nov 2014, 08:17

Re: SendMessage to Totoal Commander [AHK V2]

08 Jan 2024, 11:08

occupied for future 2 :D

Return to “Scripts and Functions (v2)”

Who is online

Users browsing this forum: Chunjee and 39 guests