#NoTrayIcon
;Изменяет продолжительность паузы после успешных оконных функций. Время в миллисекундах (по умолчанию=250)
Opt("WinWaitDelay", 100)
Global Const $WM_TC_COMMAND = 0x0433
;Проверяем количество параметров
If $CmdLine[0] <> '2' Then
MsgBox(4096, 'MAFF.au3', 'Проверьте параметры запуска.')
Exit
EndIf
;Получаем дескриптор окна ТС
$hWnd = WinGetHandle('[CLASS:TTOTAL_CMD]')
;Пишем в переменную %COMMANDER_PATH% и %COMMANDER_EXE%
$COMMANDER_PATH = EnvGet('COMMANDER_PATH')
$COMMANDER_EXE = EnvGet('COMMANDER_EXE')
;Запускаем 7-zip с командой list и ловим все, что она выдаст
$sOut = ''
$iPID = Run('"' & $COMMANDER_PATH & '\PLUGINS\WCX\Total7zip\7z.exe" l "' & $CmdLine[1] & '"', $COMMANDER_PATH & '\PLUGINS\WCX\Total7zip', @SW_HIDE, 2)
While 1
$sOut &= StdoutRead($iPID)
If @error Then ExitLoop
WEnd
;Проверяем конец строки - DOS/Unix/Mac
Select
Case StringInStr($sOut, @CRLF) > 0
$sDelimiter = @CRLF
Case StringInStr($sOut, @LF) > 0
$sDelimiter = @LF
Case Else
$sDelimiter = @CR
EndSelect
;и разбиваем на строки, в качестве разделителя - конец строки
$aLines = StringSplit($sOut, $sDelimiter, 1)
;Рег. выражением находим имя каталога в *.maff (это точно всегда будет 13я строка вывода?)
$MaffPath = StringRegExpReplace($aLines[13], '(\d{4}.*?\s+0\s+0\s+)([a-z0-9_]+)', '\2')
;Распаковываем *.maff в %Temp%
RunWait('"' & $COMMANDER_PATH & '\PLUGINS\WCX\Total7zip\7z.exe" x "' & $CmdLine[1] & '" -o"' & @TempDir & '" -aoa', $COMMANDER_PATH & '\PLUGINS\WCX\Total7zip', @SW_HIDE)
;Делаем активным окно ТС на всякий случай и
WinActivate($hWnd)
;далаем активной неактивную панель
Send('{TAB}')
;Открываем новую вкладку
_SendMessage($hWnd, $WM_TC_COMMAND, 3001, 0)
If @error Then
MsgBox(4096, 'MAFF.au3', '_SendMessage Error: ' & @error)
Exit
EndIf
;Открываем папку распакованного maff-файла
RunWait('"' & $COMMANDER_EXE & '" /O /S /L="' & @TempDir & '\' & $MaffPath & '"', '', @SW_HIDE)
;Тут нужно запустить Lister
;Ждем появления окна Lister
$hWndL = WinWait('[Class:TLister]', '')
;Закрываем вкладку
_SendMessage($hWnd, $WM_TC_COMMAND, 3007, 0)
If @error Then
MsgBox(4096, 'MAFF.au3', '_SendMessage Error: ' & @error)
Exit
EndIf
;возвращаем активность панели, в которой работали (закомментировать/убрать, если не нравится, как дергается окно Lister)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, '', '', '{TAB}')
WinActivate($hWndL)
;и после ждем закрытия Lister
While WinExists($hWndL)
Sleep(500)
WEnd
;Грохаем папку с распакованным *.maff
If FileExists(@TempDir & '\' & $MaffPath) Then DirRemove(@TempDir & '\' & $MaffPath, 1)
Func _SendMessage($hWnd, $iMsg, $wParam = 0, $lParam = 0, $iReturn = 0, $wParamType = 'wparam', $lParamType = 'lparam', $sReturnType = 'lresult')
Local $aResult = DllCall('user32.dll', $sReturnType, 'SendMessageW', 'hwnd', $hWnd, 'uint', $iMsg, $wParamType, $wParam, $lParamType, $lParam)
If @error Then Return SetError(@error, @extended, '')
If $iReturn >= 0 And $iReturn <= 4 Then Return $aResult[$iReturn]
Return $aResult
EndFunc ;==>_SendMessage |