Что нового

Вызвать внутренние команды

Сообщения
60
Репутация
-2
Привет. Возможно ли, с помощью AutoIt вызывать функции и внутренние команды других программ?
В данном случае, меня интересует Total Commander.
Вот я хочу вызвать внутреннюю команду cm_SpreadSelection.
Как мне её возможно вызвать напрямую?
Без всяких кликов, SendKeys, вызовов меню и т.д.
 
Автор
Parazit
Сообщения
60
Репутация
-2
damien2008, спасибо, Вам за суету, но мне это не подходит, потому как я хотел обойтись без стороних ActiveX компонентов. Были бы два этих скрипта без TCScript.Helper, было бы то, что мне нужно.
Мне нужна минимальность. AutoIt - вот тот единственный хэлпер, который у меня зарегистрирован в системе.
Поэтому, я надеялся использовать в своих задачах только его. Ну и конечно же VBScript и JScript, но в чистом виде
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Опишите решаемую задачу, возможно TC и не понадобится, находить/копировать/переименовывать файлы можно напрямую из Autoit.
 
Автор
Parazit
Сообщения
60
Репутация
-2
hedji сказал(а):
Опишите решаемую задачу
Задача - научиться вызывать внутренние команды. Тотал командер я привёл только для примера.

На одном форуме мне уже подсказали, что это возможно делать с помощью DllCall (User32Dll....
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Немножко не в ту сторону копаете: DllCall вызывает функцию, хранящуюся в данной dll (аналогично вызову функций из файлов добавленных в скрипт посредством #include), а вот какую именно функцию вызвать и с какими параметрами - надо гуглить описание конкретной dll.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
если у программы есть библиотеки с возможностью вызывать функции, то можно ими пользоваться
но зачастую все функции закрыты.
единственное, автор программы может допускать запуск с параметрами.
если всего этого нет, то это будет "костыленаписание"
проще написать на автоите свою программу, чем ловить глюки чужой.
примеров работы с файловой системой на форуме куча куч.
ну или других, какие нужны.
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Parazit

Есть офорум ТС, есть русский форум, не раз обсуждалось (кстати, здесь тоже были темы).
Моя подсказка:

Код:
#NoTrayIcon

Opt('WinWaitDelay', 100)

Global Const $WM_COPYDATA = 0x004A
Global Const $WM_USER = 0x400

$hTC = WinGetHandle('[CLASS:TTOTAL_CMD]')
AutoItWinSetTitle(@ScriptName)
$hWndPar = WinGetHandle(@ScriptName)

$iCMCommand = 2400 ;cm_MultiRenameFiles http://flint-inc.ru/tcinfo/all_cmd.ru.htm
$sEMCommand = 'em_FileSyncStandalone' ;Параметры через пробел! Например: 'em_AppendTabs "' & $sFileName & '"'
$sl = __CheckANSItoUTF8('C:\Temp\')
$sr = __CheckANSItoUTF8('C:\Temp\')
$sPar = 'T' ; ST, S, T - не обязательно, см. описание функции

_TC_cm_command($iCMCommand)
_TC_em_command(__CheckANSItoUTF8($sEMCommand))
_TC_cd_command($sl, $sr, $sPar)

; ANSI >> UTF-8 (if need)
Func __CheckANSItoUTF8($sStr)
    Local $sStrTemp, $BOM = Chr(239) & Chr(187) & Chr(191) ; \xEF \xBB \xBF
    $sStrTemp = BinaryToString(StringToBinary($sStr, 1), 1)
    If Not ($sStr == $sStrTemp) Then
        $sStr = BinaryToString(StringToBinary($sStr, 4))
        Return $BOM & $sStr
    Else
        Return $sStr
    EndIf
EndFunc   ;==>__CheckANSItoUTF8

; =============================================================================
; Internal command
Func _TC_cm_command($Command)
    DllCall("user32.dll", "int", "PostMessage", "hwnd", $hTC, "int", $WM_USER + 51, "wparam", $Command, "lparam", 0)
EndFunc   ;==>_TC_cm_command

; =============================================================================
; EM command
Func _TC_em_command($sCommand)
    Local $pCommand = DllStructCreate("char[" & StringLen($sCommand) + 1 & "]")
    Local $pCopyData = DllStructCreate("ulong_ptr;dword;ptr")
    DllStructSetData($pCommand, 1, $sCommand)
    DllStructSetData($pCopyData, 1, Asc("E") + 256 * Asc("M"))
    DllStructSetData($pCopyData, 2, DllStructGetSize($pCommand))
    DllStructSetData($pCopyData, 3, DllStructGetPtr($pCommand))
    DllCall("user32.dll", "int", "SendMessageW", "hwnd", $hTC, "uint", $WM_COPYDATA, "wparam", $hWndPar, "lparam", DllStructGetPtr($pCopyData))
EndFunc   ;==>_TC_em_command

; =============================================================================
; CD command
;
; CD для перехода в другой каталог на одной или обеих панелях.
; Строка lpData должна быть в следующем формате (пример для языка C/C++):
; "c:\\test1\x0dc:\\test2\x00ST\x00"
; Первый путь - левая панель, второй - правая; любой из них может быть опущен (но симмвол-разделитель \x0d должен оставаться).
; Флаги после первого нулевого символа опциональны. "S": трактовать пути как исходный/целевой; "T": открывать пути в новых вкладках.
; Аналог:
; $COMMANDER_EXE = EnvGet('COMMANDER_EXE')
; Run('"' & $COMMANDER_EXE & '" /O /S /T /L="' & $left & '" /R="' & $right & '"')

Func _TC_cd_command($l, $r, $sFlag = "")
    Local $sCommand = $l & @CR & $r & ChrW(0) & $sFlag
    Local $pCDcom = DllStructCreate("char[" & StringLen($sCommand)+ 1 & "]")
    Local $pCopyData = DllStructCreate("ulong_ptr;dword;ptr")
    DllStructSetData($pCDcom, 1, $sCommand)
    DllStructSetData($pCopyData, 1, Asc("C") + 256 * Asc("D"))
    DllStructSetData($pCopyData, 2, DllStructGetSize($pCDcom))
    DllStructSetData($pCopyData, 3, DllStructGetPtr($pCDcom))
    DllCall("user32.dll", "int", "SendMessageW", "hwnd", $hTC, "int", $WM_COPYDATA, "wparam", $hWndPar, "lparam", DllStructGetPtr($pCopyData))
EndFunc   ;==>_TC_cd_command

Функция __CheckANSItoUTF8() на случай, если текст содержит юникод (работает только с ТС 8.51 и выше!).

Руководство по WM_COPYDATA
+в ТС9 появилась новая фича Сообщение WM_USER+50 с wparam.

Для AkelPad:
AkelPad и другие приложения +AkelPad: WM_COPYDATA с CD_PARSECMDLINEW
 
Автор
Parazit
Сообщения
60
Репутация
-2
Skif_off, скрипт выдаёт ошибку.

$hGUI
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Parazit
В функции _TC_em_command() нужно заменить $hGUI на $hWndPar (что-тот менял в этой подсказке, функции скопировал из скрипта, который некоторые команды шлёт ДО того, как нарисует своё главное окно $hGUI).
Исправил пост.
 
Автор
Parazit
Сообщения
60
Репутация
-2
Skif_off, спасибо. Хороший скрипт. Его можно переделать под свои нужды
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Parazit
Это не совсем рабочий скрипт :smile: Просто подсказка-примеры, чтобы не писать заново.
 
Верх