<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AutoHotkey: умный запуск Total Commander`а]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=146</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=146&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AutoHotkey: умный запуск Total Commander`а».]]></description>
		<lastBuildDate>Tue, 19 Sep 2006 02:13:02 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[AutoHotkey: умный запуск Total Commander`а]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=629#p629</link>
			<description><![CDATA[<p>Как вам наверняка известно, народ уже давно просит Гислера (автора Total Commander`а) сделать, чтобы окно поиска файлов работало в фоне, т.е., чтобы можно было продолжать работу в Тотале, пока идет поиск (а идти он может и несколько часов, при определенном запросе). Не менее известно и легендарное упрямство этого доброго мужчины. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Поэтому, я накатал этот скриптик.<br />Работает он так:<br />- <strong>по горячей клавише (Alt+Shift+W) запускается Тотал</strong>;<br />- если он уже запущен, то проверяется, не идет ли в нем поиск или синхронизация (нужные окна легко вписать), и если идет, то запускается новый экземпляр ТС;<br />- если уже открыто несколько экземпляров Тотала, то проверяется, нет ли среди них свободного от окон-тормозов, и если есть, то этот экземпляр активизируется.<br />- <strong>по другой горячей клавише (WIN+T) открывается новая вкладка ТС и в ней - путь из буфера</strong> (папка или архив). Удобно скопировать путь откуда-нибудь, а потом р-раз - и он открыт в Тотале. Если в буфере путь к файлу, то откроется папка, в которой этот файл лежит.</p><p>Кстати, новый экземпляр ТС открывается (если нужно) независимо от того, разрешено ли это в настройках Тотала. Бонусом можно считать, что Тотал скриптом спокойно поднимается из трея (если вы выбрали в настройках сворачиваться в трей, то тут у самого ТС не все гладко).<br />Этот скрипт у меня постоянно загружен, но его легко подправить так, чтобы он был &quot;обычным&quot; скриптом, а горячие клавиши назначить обычным виндовым способом.</p><div class="codebox"><pre><code>;*******************************************************************************
; 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 ; список окон, блокирующих работу ТС (разделитель - &quot;|&quot;)
; назначены окна: Поиск, Синхронизация, Настройка
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ==========


; ================= ЗАПУСТИТЬ (ИЛИ АКТИВИЗИРОВАТЬ) TOTAL COMMANDER ==================
!+sc011:: ; Alt+Shift+W - запуск или активация Total Commander`а
;-----------------------------------------------------------------------------
    Total_Run: ; метка входа для WIN+T
    IfWinExist, ahk_class TTOTAL_CMD ; если TC запущен, то...
    {
        Loop, parse, TSuspend_List, | ; обработать список окон, блокирующих работу ТС (разделитель - &quot;|&quot;)
        {
            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 &gt; SuspCount) ; если экземпляров ТС больше количества блокирующих окон, то...
        {
            ; Будем искать свободный ТС
            Loop, %SuspCount% ; лопатим столько раз, сколько найдено окон-блокировщиков
            {
                WinGet, CurWin_PID, PID, % &quot;ahk_id&quot; ArraySusp_ID%A_Index% ; получаем идентификатор процесса окна-блокировщика
                Loop, %ArrayTC_ID% ; просмотреть массив экземпляров ТС
                {
                    WinGet, Total_PID, PID, % &quot;ahk_id&quot; ArrayTC_ID%A_Index% ; получаем идентификатор процесса ТС
                    If CurWin_PID = %Total_PID% ; если окно-блокировщик поиска принадлежит текущему обрабатываемому окну ТС, то...
                        ArrayTC_ID%A_Index% = ; обнуляем этот элемент массива (такой Тотал нам не нужен)
                }
            }
            ; Свободный Тотал найден, сейчас мы его активизируем
            Loop, %ArrayTC_ID% ; просмотреть массив экземпляров ТС
            {
                If NOT ArrayTC_ID%A_Index% ; если здесь пусто (мы обнуляли этот элемент), то...
                    Continue ; берем следующее окно Тотала
                WinActivate, % &quot;ahk_id&quot; ArrayTC_ID%A_Index% ; активировать найденный свободный ТС
                Goto, ClearVars ; очищаем переменные, конец обработки горячей клавиши
            }
        }
        ; Если все экземпляры ТС - заняты, то...
    }
    ; Если ТС еще не запущен, то...
    Run, &quot;%TotalCmd_Path%&quot; /N &quot;i=%TotalCmd_IniName%&quot;,,, 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, &quot;%TotalCmd_Path%&quot; /O /T /L=&quot;%Path_From_Bufer%&quot; ; использовать запущенный TC и установить в левую панель путь из буфера
        ; /R= - открыть папку в правой панели; /T - открыть папку в новой вкладке
    Path_From_Bufer = ; очищаем переменную, готовимся к следующему запуску гор. клавиши
Return ; закончить обработку горячей клавиши</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Androgen)]]></author>
			<pubDate>Tue, 19 Sep 2006 02:13:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=629#p629</guid>
		</item>
	</channel>
</rss>
