Skif_off
|
Posted: Thu Sep 25, 2014 02:16 Post subject: |
|
|
AlexBiggest
Ну, "решение" - это слишком громко
Просто пришла в голову мысль автоматизировать:
- распаковать maff-файл в %temp%, при этом читая вывод 7z (внутри maff-файла папка, нам нужно её имя);
- перейти на неактивную пенель;
- создать вкладку (решил усложнить, мало ли что открыто - вдруг нужное), открыть в ней каталог распакованного maff-файла;
- дальше уже самому нужно нажать Просмотр по html-файлу.
Скрипт ждет появления и закрытия окна Lister (проверяет с интервалом 500 мс), потом закрывает вкладку, возвращает активность рабочей файловой панели и удаляет в %temp% распакованный maff-файл.
Т.к. используются дескрипторы, а не заголовки окон, гипотетически: несколько открытых для просмотра файлов (и окон Lister) не должны быть проблемой.
Утилита TCFS2 заменена на ключи запуска ТС.
В папку плагина Total7zip необходимо добавить файл 7z.exe из дистрибутива 7-Zip (забыл упомянуть в первый раз - давно у меня, привык). Или положить его куда угодно (хоть установленный), только поправить путь.
Кнопка Code: | TOTALCMD#BAR#DATA
"%COMMANDER_PATH%\AutoIt.exe" "%COMMANDER_PATH%\UTILITIES\MAFF.au3"
%P%N "%P"
AutoIt3_v10.ico
MAFF
%COMMANDER_PATH%\UTILITIES\
-1 |
Скрипт Code: |
#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 |
Если не нравится дерганье окна Lister, убрать/закомментировать
Code: | _SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, '', '', '{TAB}')
WinActivate($hWndL) |
Хотя так получается быстрее, чем делать окно ТС активным, посылать Send('{TAB}') и потом уже активировать окно Lister.
З.Ы. Кстати,
Hidden text
Code: | _SendMessage($hWnd, $WM_TC_COMMAND, NNNN, 0) |
отлично работает с ТС: NNNN - команда TC в десятичном формате (список), в начале скрипта нужно добавить
Code: | Global Const $WM_TC_COMMAND = 0x0433 |
Еще раз, уже публично, спасибо MVV за подсказку
З.З.Ы. Размышления/мысли вслух убраны, оставлен окончательный вариант. "As is", как говорится. Работает в AutoIt 3.3.8.1 и 3.3.12.0, MAFF не пользуюсь, поддержку (хотя тут всё просто в общем) не обещаю.
Добавлено:
Косметика: исправлен заголовок окна ошибки _SendMessage(), поленился набирать и скопировал из скрипта FastCopy Исправлено.
Добавлена проверка параметров запуска (только количество). |
|