1

Тема: AutoHotkey: умный запуск Total Commander`а

Как вам наверняка известно, народ уже давно просит Гислера (автора Total Commander`а) сделать, чтобы окно поиска файлов работало в фоне, т.е., чтобы можно было продолжать работу в Тотале, пока идет поиск (а идти он может и несколько часов, при определенном запросе). Не менее известно и легендарное упрямство этого доброго мужчины. Поэтому, я накатал этот скриптик.
Работает он так:
- по горячей клавише (Alt+Shift+W) запускается Тотал;
- если он уже запущен, то проверяется, не идет ли в нем поиск или синхронизация (нужные окна легко вписать), и если идет, то запускается новый экземпляр ТС;
- если уже открыто несколько экземпляров Тотала, то проверяется, нет ли среди них свободного от окон-тормозов, и если есть, то этот экземпляр активизируется.
- по другой горячей клавише (WIN+T) открывается новая вкладка ТС и в ней - путь из буфера (папка или архив). Удобно скопировать путь откуда-нибудь, а потом р-раз - и он открыт в Тотале. Если в буфере путь к файлу, то откроется папка, в которой этот файл лежит.

Кстати, новый экземпляр ТС открывается (если нужно) независимо от того, разрешено ли это в настройках Тотала. Бонусом можно считать, что Тотал скриптом спокойно поднимается из трея (если вы выбрали в настройках сворачиваться в трей, то тут у самого ТС не все гладко).
Этот скрипт у меня постоянно загружен, но его легко подправить так, чтобы он был "обычным" скриптом, а горячие клавиши назначить обычным виндовым способом.

;*******************************************************************************
; AutoHotkey Version:   1.0.44.09+
; Автор:                Androgen Belkin
; Имя скрипта:          TC_SmartRan.ahk (v.1.3)
;*******************************************************************************
; Запуск или активация Total Commander`а, и открытие в панели пути из буфера.
;*******************************************************************************
#NoTrayIcon             ; не отображать иконку скрипта в трее
DetectHiddenWindows, On ; искать в скрытых окнах (если Тотал свёрнут в трей)
#NoEnv                  ; запрещаем имена переменных как у переменных окружения

; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ===============
TotalCmd_Path = D:\Totalcmd\Totalcmd.exe ; путь к Тоталу
TotalCmd_IniName = .\MyProfile\Wincmd.ini ; путь к вашему ини-файлу
TSuspend_List = TFindFile|TCmpForm|TDLGCONFIGALL ; список окон, блокирующих работу ТС (разделитель - "|")
; назначены окна: Поиск, Синхронизация, Настройка
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ==========


; ================= ЗАПУСТИТЬ (ИЛИ АКТИВИЗИРОВАТЬ) TOTAL COMMANDER ==================
!+sc011:: ; Alt+Shift+W - запуск или активация Total Commander`а
;-----------------------------------------------------------------------------
    Total_Run: ; метка входа для WIN+T
    IfWinExist, ahk_class TTOTAL_CMD ; если TC запущен, то...
    {
        Loop, parse, TSuspend_List, | ; обработать список окон, блокирующих работу ТС (разделитель - "|")
        {
            IfWinNotExist, ahk_class %A_LoopField% ; если окна-блокировщика (из списка) не существует, то...
                Continue ; переходим к следующему окну-блокировщику
            WinGet, Temp_Array_ID, list, ahk_class %A_LoopField% ; получить в массив список всех хэндлов блокирующих окон
            Loop, %Temp_Array_ID% ; сливаем содержимое текущего массива в общий массив
            {
                SuspCount += 1 ; подсчитываем количество найденных окон
                ArraySusp_ID%SuspCount% := Temp_Array_ID%A_Index% ; собственно слив содержимого текущего массива в общий массив
            }
        }
        ; Если нет окон-блокировщиков, то...
        If NOT SuspCount ; если нет окон-блокировщиков
        {
            WinActivate, ahk_class TTOTAL_CMD ; активировать первый попавшийся ТС
            Goto, ClearVars ; очищаем переменные, конец обработки горячей клавиши
        }
        ; Если окна-блокировщики есть, то...
        WinGet, ArrayTC_ID, list, ahk_class TTOTAL_CMD ; получить в массив список всех хэндлов окон ТС
        If (ArrayTC_ID > SuspCount) ; если экземпляров ТС больше количества блокирующих окон, то...
        {
            ; Будем искать свободный ТС
            Loop, %SuspCount% ; лопатим столько раз, сколько найдено окон-блокировщиков
            {
                WinGet, CurWin_PID, PID, % "ahk_id" ArraySusp_ID%A_Index% ; получаем идентификатор процесса окна-блокировщика
                Loop, %ArrayTC_ID% ; просмотреть массив экземпляров ТС
                {
                    WinGet, Total_PID, PID, % "ahk_id" ArrayTC_ID%A_Index% ; получаем идентификатор процесса ТС
                    If CurWin_PID = %Total_PID% ; если окно-блокировщик поиска принадлежит текущему обрабатываемому окну ТС, то...
                        ArrayTC_ID%A_Index% = ; обнуляем этот элемент массива (такой Тотал нам не нужен)
                }
            }
            ; Свободный Тотал найден, сейчас мы его активизируем
            Loop, %ArrayTC_ID% ; просмотреть массив экземпляров ТС
            {
                If NOT ArrayTC_ID%A_Index% ; если здесь пусто (мы обнуляли этот элемент), то...
                    Continue ; берем следующее окно Тотала
                WinActivate, % "ahk_id" ArrayTC_ID%A_Index% ; активировать найденный свободный ТС
                Goto, ClearVars ; очищаем переменные, конец обработки горячей клавиши
            }
        }
        ; Если все экземпляры ТС - заняты, то...
    }
    ; Если ТС еще не запущен, то...
    Run, "%TotalCmd_Path%" /N "i=%TotalCmd_IniName%",,, Total_PID ; запустить новый экземпляр TC с указанным ини-файлом
    WinWait, ahk_pid %Total_PID% ; подождать окно запущенного Тотала
    WinActivate ; активировать его
    ClearVars: ; метка входа очищения переменных
    ArrayTC_ID =
    CurWin_PID =
    SuspCount =
    Total_PID =
Return ; закончить обработку горячей клавиши
;-----------------------------------------------------------------------------

;-----------------------------------------------------------------------------
#sc014:: ; WIN+T - запуск или активация Total Commander`а, и открытие пути из буфера в левой панели
;-----------------------------------------------------------------------------
    Path_From_Bufer = %Clipboard% ; внести буфер в переменную
    Gosub, Total_Run ; запускаем или активизируем Тотал
    IfExist, %Path_From_Bufer% ; если в буфере содержится существующий путь, то...
        Run, "%TotalCmd_Path%" /O /T /L="%Path_From_Bufer%" ; использовать запущенный TC и установить в левую панель путь из буфера
        ; /R= - открыть папку в правой панели; /T - открыть папку в новой вкладке
    Path_From_Bufer = ; очищаем переменную, готовимся к следующему запуску гор. клавиши
Return ; закончить обработку горячей клавиши
Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).