Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Скрипты Autohotkey
Goto page 1, 2, 3, 4, 5, 6, 7  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
KarS



Joined: 21 Apr 2006
Posts: 89
Location: г. Абакан

Post (Separately) Posted: Fri Apr 21, 2006 17:06    Post subject: Скрипты Autohotkey Reply with quote

Мне понравилась программа Autohotkey, хотя в ней я еще плохо разбираюсь.
Попробовал для Total написать некоторые скрипты. Например,
#sc02D::
DetectHiddenWindows, On
if not WinExist( "ahk_class TTOTAL_CMD" )
Run, C:\Program Files\Total Commander\TOTALCMD.EXE
WinActivate
return
;переход в нижнюю директорию
!PgUp::
IfWinActive, ahk_class TTOTAL_CMD
ControlSend, ,2 ^{PGUP}
Send, {Up}
Send, ^{PGDN}
return

;переход в верхнюю директорию
!PgDn::
IfWinActive, ahk_class TTOTAL_CMD
ControlSend, ,2 ^{PGUP}
Send, {Down}
Send, ^{PGDN}
return

;копирование по клавише f5 без подтверждения
;(либо перемещение, если подставить f6)
$f5::
IfWinNotActive, ahk_class TTOTAL_CMD
{
Send, {f5}
Return
}
ControlSend, ,2 {f5}
WinWait, ahk_class TInpComboDlg
Send, {Enter}
Return

Но вот как отправлять другие команды в Total непосредственно разобраться не могу. Например, как отправить в неактивную панель команду cm_OpenRecycled. На авторском сайте http://www.ghisler.ch/wiki/index.php/AutoHotkey выложен пример "AutoHotkey: Send a command to Total Commander (by SanskritFritz)", но там все по-английски, а я в нем не силен. Пробовал подставлять, то что там написано в тело скрипта, но не получается.
Может кто-нибудь подскажет чего, плиз.
Back to top
View user's profile Send private message
funduk



Joined: 16 Aug 2005
Posts: 1511
Location: Санкт-Петербург

Post (Separately) Posted: Fri Apr 21, 2006 20:14    Post subject: Reply with quote

Quote:
но там все по-английски, а я в нем не силен

Плохо, что не силён. Там, на оффоруме, от AHK все без ума, а здесь я вообще ни одного человека, юзавшего AHK, не знаю.
Back to top
View user's profile Send private message
KarS



Joined: 21 Apr 2006
Posts: 89
Location: г. Абакан

Post (Separately) Posted: Sat Apr 22, 2006 10:09    Post subject: Reply with quote

По Autohotkey есть рускоязычный форум http://forum.script-coding.info/topics.php, но там взаимодействие с Total Commander почти не обсуждают.
Back to top
View user's profile Send private message
Belkin



Joined: 22 Feb 2005
Posts: 26

Post (Separately) Posted: Tue Apr 25, 2006 05:01    Post subject: Reply with quote

Посылать Тоталу его же команды с помощью AutoHotkey очень просто.
Нужно открыть файл Totalcmd.inc и найти там интересующую тебя команду.
Рядом с этой командой стоит число. Это число и нужно использовать как wParam в команде PostMessage.
А в качестве Msg (сообщения) нужно использовать шестнадцатиричный код команды WM_USER+51. Это число 0x433.
Выглядит жутковато, но ничего сложного.
Например, для команды Тотала "cm_OpenRecycled" находим в Totalcmd.inc число 2127.
Значит, чтобы с помощью AutoHotkey выслать Тоталу эту команду, пишем:
PostMessage, 0x433, 2127,,, ahk_class TTOTAL_CMD ; выслать команду cm_OpenRecycled окну ТС
; (0x433 - WM_USER+51, 2127 - wParam,,, ahk_class - класс окна)
А если хотим, например, выслать команду cm_SrcTree, то пишем:
PostMessage, 0x433, 303,,, ahk_class TTOTAL_CMD
Правда просто?
Удачи
Back to top
View user's profile Send private message
KarS



Joined: 21 Apr 2006
Posts: 89
Location: г. Абакан

Post (Separately) Posted: Tue Apr 25, 2006 14:48    Post subject: Reply with quote

Belkin
Большое спасибо за помощь. Very Happy
Я сразу для себя написал скрипт
<!r::
PostMessage, 0x433, 4001,,, ahk_class TTOTAL_CMD
PostMessage, 0x433, 2127,,, ahk_class TTOTAL_CMD
return
Теперь по комбинации LAlt+R у меня на левой панели будет отображаться содержимое корзины.

У меня возник ещё один вопрос.
В случае, когда TotalCom не запущен, как можно его запустить с тем, чтобы в левой панели появилось содержимое корзины?
Для запуска TotalCom я использую следующий скрипт:

#x::
DetectHiddenWindows, On
if not WinExist( "ahk_class TTOTAL_CMD" )
Run, C:\Program Files\Total Commander\TOTALCMD.EXE
WinActivate
return

Т.е. по Win+X происходит запуск программы либо активация её окна, когда она свернута в трей.
Но если в следующих строках (перед return) записать:
PostMessage, 0x433, 4001,,, ahk_class TTOTAL_CMD
PostMessage, 0x433, 2127,,, ahk_class TTOTAL_CMD
return
то программа запускается, однако перехода в корзину не происходит.
Что делать? Sad
Back to top
View user's profile Send private message
Belkin



Joined: 22 Feb 2005
Posts: 26

Post (Separately) Posted: Tue Apr 25, 2006 23:09    Post subject: Reply with quote

Причина в том, что скрипт работает очень быстро, и к тому моменту, когда (командой Run) запустится Тотал, все последующие команды уже успеют выполниться, не сделав того, что должны.
Чтобы этого не происходило, нужно после команды Run добавить ожидание окна Тотала (команда WinWait, ahk_class TTOTAL_CMD).
Кроме того, для большей надежности, лучше использовать команду SendMessage, а не PostMessage. Эти команды отличаются тем, что скрипт после высылки SendMessage ждет ответа от приложения (в нашем случае ответа от Тотала), что команда принята и выполнена. А при использовании PostMessage, скрипт ответа не ждет.
В общем случае лучше использовать команду SendMessage. Исключение составляют ситуации, когда посланная нами команда вызывает модальный диалог, и мы не хотим, чтобы скрипт ждал, пока этот диалог завершится.
Добавлю, что время ожидания ответа после SendMessage не бесконечно, а составляет пять секунд. Но этого времени больше, чем достаточно, чтобы обработать поставленную в очередь команду (винда ведь многозадачна).
Кстати, синтаксис команды SendMessage полностью идентичен команде PostMessage. Т.е., например:
SendMessage, 0x433, 2127,,, ahk_class TTOTAL_CMD ; cm_OpenRecycled
Привет. Успехов.
Back to top
View user's profile Send private message
KarS



Joined: 21 Apr 2006
Posts: 89
Location: г. Абакан

Post (Separately) Posted: Wed Apr 26, 2006 16:53    Post subject: Reply with quote

Belkin
Спасибо за внимание и доступность объяснения Very Happy .
Теперь скрипт поправил:
<!r::
DetectHiddenWindows, On
IfWinActive, ahk_class TTOTAL_CMD
SendMessage, 0x433, 4001,,, ahk_class TTOTAL_CMD
SendMessage, 0x433, 2127,,, ahk_class TTOTAL_CMD
IfWinNotActive, ahk_class TTOTAL_CMD
Run, C:\Program Files\Total Commander\TOTALCMD.EXE
WinWait, ahk_class TTOTAL_CMD
SendMessage, 0x433, 4001,,, ahk_class TTOTAL_CMD
SendMessage, 0x433, 2127,,, ahk_class TTOTAL_CMD
return

И всё заработало Very Happy .

Пересмотрел и скрипт для клавиш F5/F6:
f5::
IfWinActive, ahk_class TTOTAL_CMD
PostMessage, 0x433, 905,,, ahk_class TTOTAL_CMD
WinWait, ahk_class TInpComboDlg
Send, {Enter}
Return
f6::
IfWinActive, ahk_class TTOTAL_CMD
PostMessage, 0x433, 1005,,, ahk_class TTOTAL_CMD
WinWait, ahk_class TInpComboDlg
Send, {Enter}
Return

Так работает более корректно. Обращаю внимание, что здесь пришлось использовать команду PostMessage, т.к. применение SendMessage в этом скрипте приводит к тому, что диалоговое окно "ahk_class TInpComboDlg" зависает на несколько секунд, а потом уже выполняется команда Send, {Enter} и окно исчезает.
В связи с этим, теперь не знаю какую лучше команду использовать (т.е. более грамотно) в срипте открытия корзины - SendMessage или PostMessage, ведь обе срабатывают.
Back to top
View user's profile Send private message
Belkin



Joined: 22 Feb 2005
Posts: 26

Post (Separately) Posted: Thu Apr 27, 2006 00:40    Post subject: Reply with quote

2 KarS
В срипте открытия корзины грамотнее использовать SendMessage.

Однако, в твоем последем скриптике про корзину есть пара ошибок/неточностей.
Во-первых, неверен синтаксис команды if. И хотя случайно работает и неверный вариант, все же лучше освоить правильный. Он будет выглядеть вот так:
Code:
<!r::
DetectHiddenWindows, On
IfWinActive, ahk_class TTOTAL_CMD
{
    SendMessage, 0x433, 4001,,, ahk_class TTOTAL_CMD
    SendMessage, 0x433, 2127,,, ahk_class TTOTAL_CMD
}
IfWinNotActive, ahk_class TTOTAL_CMD
{
    Run, C:\Program Files\Total Commander\TOTALCMD.EXE
    WinWait, ahk_class TTOTAL_CMD
    SendMessage, 0x433, 4001,,, ahk_class TTOTAL_CMD
    SendMessage, 0x433, 2127,,, ahk_class TTOTAL_CMD
}
return

Во-вторых, не верна логика скрипта. Поэтому скрипт выше НЕ ВЕРНЫЙ. И хотя он и работает, но только при определенных условиях, которые я не стану рассматривать.
Во-третьих, ты проверяешь активность окна Тотала, а нужно проверять его существование (т.е. запущен он или нет).

А вот как правильно. Я приведу 2 варианта с разным синтаксисом.
Вариант 1: (со скобками в команде if)

Code:
<!r:: ; назначаем горячую клавишу
DetectHiddenWindows, On ; ищем и в скрытых окнах (если ТС свернут в трей)
IfWinNotExist, ahk_class TTOTAL_CMD ; если не существует окна Тотала (он не запущен), то...
{ ; эту (и парную ей) скобку можно не указывать, если между ними только одна команда. Если команд больше одной - скобки нужны.
    Run, C:\Program Files\Total Commander\TOTALCMD.EXE ; запустить ТС
    WinWait, ahk_class TTOTAL_CMD ; подождать окно ТС
} ; это парная первой скобка
; Все команды ниже будут выполнятся независимо от того был ли уже запущен ТС, или запустился только что.
WinActivate ; активировать окно ТС
SendMessage, 0x433, 4001,,, ahk_class TTOTAL_CMD ; переключиться на левую панель
SendMessage, 0x433, 2127,,, ahk_class TTOTAL_CMD ; открыть в ней корзину
return ; конец действий по горячей клавише

Вариант 2: (без скобок в команде if)

Code:
<!r:: ; назначаем горячую клавишу
DetectHiddenWindows, On ; ищем и в скрытых окнах (если ТС свернут в трей)
IfWinNotExist, ahk_class TTOTAL_CMD ; если не существует окна Тотала (он не запущен), то...
    Run, C:\Program Files\Total Commander\TOTALCMD.EXE ; запустить ТС
; Все команды ниже будут выполнятся независимо от того был ли уже запущен ТС, или запустился только что.
WinWait, ahk_class TTOTAL_CMD ; подождать окно ТС
WinActivate ; активировать окно ТС
SendMessage, 0x433, 4001,,, ahk_class TTOTAL_CMD ; переключиться на левую панель
SendMessage, 0x433, 2127,,, ahk_class TTOTAL_CMD ; открыть в ней корзину
return ; конец действий по горячей клавише


Оба варианта правильны, хотя первый вариант чуть более грамотен (не из-за скобок, а потому, что ожидаем окно (WinWait) после запуска Тотала, и не ожидаем, если Тотал уже запущен. И хотя это ожидание во втором случае и длится доли секунды, но всё же оно лишнее).

По поводу твоего "скрипта для Totalcmd F5/F6"...
Поскольку то, что я хочу сказать относится скорее к AutoHotkey, чем к Total Commander`у, то выскажусь в твоем топике на http://forum.script-coding.info/topic.php?topic=90
Back to top
View user's profile Send private message
KarS



Joined: 21 Apr 2006
Posts: 89
Location: г. Абакан

Post (Separately) Posted: Thu Apr 27, 2006 17:22    Post subject: Reply with quote

Belkin
Я в восторге Very Happy . Честно.
Не ожидал такого точного, квалифицированного и доступного ответа.
Огромное спасибо за ликбез и помощь.
Back to top
View user's profile Send private message
Igor_A.



Joined: 23 Mar 2006
Posts: 78

Post (Separately) Posted: Sun Sep 03, 2006 13:38    Post subject: Reply with quote

Автору топика респект!

Немедленно скомпилил экзешник, который висит в систрее и отслеживает f5 и f6! Супер удобно.

Остаётся гадать, ну почему автор Тотала так упорно не хочет сделать опциональным дурацкий запрос при копировании перемещении через клавиатуру?!
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2533
Location: Большая деревня Москва

Post (Separately) Posted: Mon Sep 04, 2006 19:56    Post subject: Reply with quote

Quote:
Остаётся гадать, ну почему автор Тотала так упорно не хочет сделать опциональным дурацкий запрос при копировании перемещении через клавиатуру?!
А разве "Configuration \ Misc \ Get confirmation before" - это не то?! Не нравятся запросы - убери всех птиц. Лично я оставил только вторую - Overwriting files.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Igor_A.



Joined: 23 Mar 2006
Posts: 78

Post (Separately) Posted: Wed Sep 06, 2006 21:39    Post subject: Reply with quote

2 Вахмурка
Конечно не то!!!
Что там не ставь или не убирай, а одним нажатием на f5 или f6 штатно не скопируешь (переместишь) файл (файлы). Выскочит окошко с вариантами копирования. Если мышкой тянуть, то никакого запроса не будет, но я то, как и многие, привык топтать клаву Smile. Вот потому и удобно иметь откомпилированный скрипт под рукой.
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2533
Location: Большая деревня Москва

Post (Separately) Posted: Wed Sep 06, 2006 23:31    Post subject: Reply with quote

Уболтал Smile
Я бы просто написал в ТС команду:
Code:
powerpro.exe *keys {f5}{enter}
и повесил на F5. Никакой компиляции и никакого отслеживания.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Igor_A.



Joined: 23 Mar 2006
Posts: 78

Post (Separately) Posted: Thu Sep 07, 2006 20:51    Post subject: Reply with quote

Ага. А весит этот паверпро сколько?!

А откомпилированный экзешник со скриптом - около 180 кило примерно.
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2533
Location: Большая деревня Москва

Post (Separately) Posted: Fri Sep 08, 2006 16:45    Post subject: Reply with quote

"Весит" - в смысле дистрибутив? Какая разница? Важно, сколько прога жрет оперативки. PowerPro около 1.5 метров. При этом у тебя - менеджеры: горячих клавиш, буфера обмена, операций с мышью, виртуальных рабочих столов, скриптов, менюшек, панелей, трея, окон, таймеров, планировщика... (еще примерно "полстолька" остального, лень все перечислять). Посмотри ради прикола, сколько отъедает оперативки твой скрипт.
Помимо этого, избавившись от запроса на копирование, ты лишаешь себя кучи полезных свойств. Во-первых, очередь. Во-вторых, нажми кнопку "Options..." и посмотри, сколько там всего. В-третьих, тебе никогда не приходилось копировать (а скорее перемещать) что-то туда, где оно ну никак не должно находиться?! Запрос - еще одна гарантия. Именно по этим соображениям, полагаю, Гислер и не ввел возможность отмены запроса.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2, 3, 4, 5, 6, 7  Next
Page 1 of 7

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group