<?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=69</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=69&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AutoHotkey: советы по автоматизации Total Commander».]]></description>
		<lastBuildDate>Sun, 17 Dec 2006 08:30:14 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AutoHotkey: советы по автоматизации Total Commander]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=1295#p1295</link>
			<description><![CDATA[<p>В Total Commander&#039;е, начиная с версии 7.0 public beta 1, появилась возможность создавать пользовательские команды. Это просто зверски расширяет возможности его автоматизации (да и просто зверски расширяет его возможности) <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />. Расскажу о двух возможных способах это использовать.</p><p><strong>Первый способ</strong> - самый очевидный (и, как мне кажется, <strong>самый удобный</strong>). Нужно создать пользовательскую команду (как это сделать рассказывать не стану), и назначить на неё псевдоним (alias). (Назначается там же, где и горячие клавиши). Для примера, назовём этот псевдоним <strong>MyAlias</strong>. Всё, теперь его можно смело посылать Тоталу в ком. строку, примерно так:</p><div class="codebox"><pre><code>ControlSend, Edit1, MyAlias{Enter}, ahk_class TTOTAL_CMD ; вбиваем свою команду в ком. строку</code></pre></div><p>Тут надо сказать, что и сами пользовательские команды и псевдонимы для них можно писать в соответствующие ini-файлы скриптами. Причём без перезапуска Тотала. Т.е. прямо на ходу вписать нужную команду, да и выполнить её. А затем и удалить, если она больше не понадобится. Правда тут есть некоторые сложности (а куда без них) с определением местоположения этих самых &quot;соответствующих ini-файлов&quot;. Дело в том, что одной из новых фич Тотала является возможность дробить ранее цельный wincmd.ini (или как там вы его назвали) на множество разных ini-файлов. И найти нужный не так просто, как может показаться, (это и раньше было тем ещё гемором). Но задача вполне решаемая. Собственно я её уже почти решил, но всё как-то некогда поставить последний штрих. Поставлю - выложу. Ну, это так, к слову. Двигаем далее.</p><p><strong>Второй способ</strong> посложнее, с использованием функций, но, в каких-то случаях, пригодится и он, т.к. позволяет обращаться к пользовательским командам напрямую, <strong>без псевдонимов</strong>. Это модифицированный пример из справки к AutoHotkey, который я немного подрихтовал, под наши нужды.<br /><span style="color: blue">Сами функции:</span><br /></p><div class="codebox"><pre><code>;-----------------------------------------------------------------------------
Send_WM_COPYDATA( ParameterToSent, TargetTC ) ; функция высылки Тоталу пользовательской команды em_xyz
{
    ; В качестве параметров функция принимает имя команды em_xyz и целевое окно ТС
    VarSetCapacity( CopyDataStruct, 12 ) ; устанавливаем размер высылаемой структуры данных
    InsertInteger( Asc( &quot;E&quot; ) + 256 * Asc( &quot;M&quot; ), CopyDataStruct ) ; вставляем в структуру то, что требует ТС для исполнения команд
    InsertInteger( StrLen( ParameterToSent ) + 1, CopyDataStruct, 4 ) ; добавляем собственно команду (+ символ конца строки)
    InsertInteger( &amp;ParameterToSent, CopyDataStruct, 8 ) ; добавляем указатель на собственно команду
    SendMessage, 0x4A,, &amp;CopyDataStruct,, %TargetTC% ; шлём команду Тоталу, обязательно Send, а не Post (0x4A = WM_COPYDATA)
    Return, ErrorLevel ; выходим из функции и возвращаем ответ SendMessage&#039;а
}
;-----------------------------------------------------------------------------
InsertInteger( pInteger, ByRef pDest, pOffset = 0, pSize = 4 ) ; функция заполнения структуры данными
{
    Loop, 4 ; копируем каждый байт целого числа в структуру как сырые двоичные данные
    {
        DllCall(&quot;RtlFillMemory&quot; ; заполняем структуру нашими данными
        , &quot;UInt&quot; , &amp;pDest + pOffset + A_Index-1 ; указатель на адрес, с которого начинается заполнение
        , &quot;UInt&quot; , 1 ; размер заполняемой структуры в байтах
        , &quot;UChar&quot;, pInteger &gt;&gt; 8*( A_Index-1 ) &amp; 0xFF) ; содержимое заполняемого байта
    }
}
;-----------------------------------------------------------------------------</code></pre></div><p><span style="color: blue">Примеры их использования:</span><br />Простейший пример:<br /></p><div class="codebox"><pre><code>Send_WM_COPYDATA( &quot;em_usercmd1&quot;, &quot;ahk_class TTOTAL_CMD&quot; ) ; шлём пользовательскую команду Тоталу</code></pre></div><p>Пример чуть позаковыристей:<br /></p><div class="codebox"><pre><code>DetectHiddenWindows, On ; искать в скрытых окнах (на случай, если Тотал свёрнут в трей)
WinGet, hw_TTOTAL_CMD, ID, ahk_class TTOTAL_CMD ; получить ID окна TC (не абы какого, а последнего активного :) )
UserParameter = em_usercmd2 ; эту команду будем слать
Send_WM_COPYDATA( UserParameter, &quot;ahk_id&quot; hw_TTOTAL_CMD ) ; вызываем функцию
If ErrorLevel = FAIL ; проверяем, что сказал вызов функции
    MsgBox, Команда SendMessage не удалась. Вероятно, Тотал не запущен.</code></pre></div><p><strong>Примечание:</strong> Тотал возвращает <strong>0</strong>, и если команда им была выполнена успешно, и если такой команды нет. Но во втором случае, он ещё и покажет соответствующее сообщение. На мой взгляд, не самая удачная реализация, но что есть, то есть.</p><p>Добавлю, что я пробовал с помощью <strong>Winspector Spy</strong> отловить, какие сообщения шлёт сам Тотал, когда выполняет пользовательскую команду, и использовать результат для высылки этих сообщений, но способ оказался нерабочий, т.к. wParam плавает от случая к случаю.</p><p>Удачи. Будут комменты - прошу высказываться.</p>]]></description>
			<author><![CDATA[null@example.com (Androgen)]]></author>
			<pubDate>Sun, 17 Dec 2006 08:30:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=1295#p1295</guid>
		</item>
		<item>
			<title><![CDATA[AutoHotkey: советы по автоматизации Total Commander]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=123#p123</link>
			<description><![CDATA[<p>В файле Totalcmd.inc содержатся все внутренние команды Total Commander. Найдите в этом файле интересующую вас команду, и рядом с ней будет написан <strong>wParam</strong> в десятичном виде, который можно использовать для команды <strong>SendMessage</strong>. Например, возьмём команду &quot;Показать окно быстрого поиска&quot;. Находим в указанном файле такую (или похожую, в зависимости от варианта локализации) строку: <strong>cm_ShowQuickSearch=2915;Показать окно быстрого поиска</strong>. Число <strong>2915</strong> и будет wParam для команды SendMessage.</p><p>А параметр <strong>Msg</strong> для команды <strong>SendMessage</strong> всегда будет <strong>1075</strong> - это десятичный код команды <strong>WM_USER+51</strong>. Можно использовать и шестнадцатеричный код этой команды. Число 1075 в HEX-виде будет 0x433.</p><p>Таким образом, команду SendMessage в скрипте можно задать различными способами:<br /></p><div class="codebox"><pre><code>; показать окно быстрого поиска (десятичные параметры)
SendMessage, 1075, 2915,,, ahk_class TTOTAL_CMD</code></pre></div><p>или<br /></p><div class="codebox"><pre><code>; показать окно быстрого поиска (шестнадцатеричные параметры)
SendMessage, 0x433, 0xb63,,, ahk_class TTOTAL_CMD</code></pre></div><p>или<br /></p><div class="codebox"><pre><code>; показать окно быстрого поиска (смешанные параметры)
SendMessage, 0x433, 2915,,, ahk_class TTOTAL_CMD</code></pre></div><p>Команда WM_USER+51 была найдена с помощью программы <a href="http://www.windows-spy.com/">Winspector</a>.<br />Идею опубликовал <strong>Androgen</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Fri, 21 Jul 2006 18:36:50 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=123#p123</guid>
		</item>
	</channel>
</rss>
