Тема: 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 ; закончить обработку горячей клавиши