View previous topic :: View next topic |
Author |
Message |
KarS
![](images/avatars/10388590474ad044928b22b.jpg)
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
(Separately) Posted: Fri Apr 21, 2006 17:06 Post subject: Скрипты Autohotkey |
|
|
Мне понравилась программа 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 |
|
![](templates/subSilver/images/spacer.gif) |
funduk
![](images/avatars/14976500394452148e83e9e.jpg)
Joined: 16 Aug 2005 Posts: 1513 Location: Санкт-Петербург
|
(Separately) Posted: Fri Apr 21, 2006 20:14 Post subject: |
|
|
Quote: | но там все по-английски, а я в нем не силен |
Плохо, что не силён. Там, на оффоруме, от AHK все без ума, а здесь я вообще ни одного человека, юзавшего AHK, не знаю. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
KarS
![](images/avatars/10388590474ad044928b22b.jpg)
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Belkin
Joined: 22 Feb 2005 Posts: 26
|
(Separately) Posted: Tue Apr 25, 2006 05:01 Post subject: |
|
|
Посылать Тоталу его же команды с помощью 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 |
|
![](templates/subSilver/images/spacer.gif) |
KarS
![](images/avatars/10388590474ad044928b22b.jpg)
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
(Separately) Posted: Tue Apr 25, 2006 14:48 Post subject: |
|
|
Belkin
Большое спасибо за помощь.
Я сразу для себя написал скрипт
<!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](images/smiles/icon_sad.gif) |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Belkin
Joined: 22 Feb 2005 Posts: 26
|
(Separately) Posted: Tue Apr 25, 2006 23:09 Post subject: |
|
|
Причина в том, что скрипт работает очень быстро, и к тому моменту, когда (командой 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 |
|
![](templates/subSilver/images/spacer.gif) |
KarS
![](images/avatars/10388590474ad044928b22b.jpg)
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
(Separately) Posted: Wed Apr 26, 2006 16:53 Post subject: |
|
|
Belkin
Спасибо за внимание и доступность объяснения .
Теперь скрипт поправил:
<!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
И всё заработало .
Пересмотрел и скрипт для клавиш 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 |
|
![](templates/subSilver/images/spacer.gif) |
Belkin
Joined: 22 Feb 2005 Posts: 26
|
(Separately) Posted: Thu Apr 27, 2006 00:40 Post subject: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
KarS
![](images/avatars/10388590474ad044928b22b.jpg)
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
(Separately) Posted: Thu Apr 27, 2006 17:22 Post subject: |
|
|
Belkin
Я в восторге . Честно.
Не ожидал такого точного, квалифицированного и доступного ответа.
Огромное спасибо за ликбез и помощь. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Igor_A.
![](images/avatars/14412142774bc9e597bbe1c.jpg)
Joined: 23 Mar 2006 Posts: 83
|
(Separately) Posted: Sun Sep 03, 2006 13:38 Post subject: |
|
|
Автору топика респект!
Немедленно скомпилил экзешник, который висит в систрее и отслеживает f5 и f6! Супер удобно.
Остаётся гадать, ну почему автор Тотала так упорно не хочет сделать опциональным дурацкий запрос при копировании перемещении через клавиатуру?! |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Вахмурка
![](images/avatars/3414476054480a72d7cff1.gif)
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
(Separately) Posted: Mon Sep 04, 2006 19:56 Post subject: |
|
|
Quote: | Остаётся гадать, ну почему автор Тотала так упорно не хочет сделать опциональным дурацкий запрос при копировании перемещении через клавиатуру?! | А разве "Configuration \ Misc \ Get confirmation before" - это не то?! Не нравятся запросы - убери всех птиц. Лично я оставил только вторую - Overwriting files. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Igor_A.
![](images/avatars/14412142774bc9e597bbe1c.jpg)
Joined: 23 Mar 2006 Posts: 83
|
(Separately) Posted: Wed Sep 06, 2006 21:39 Post subject: |
|
|
2 Вахмурка
Конечно не то!!!
Что там не ставь или не убирай, а одним нажатием на f5 или f6 штатно не скопируешь (переместишь) файл (файлы). Выскочит окошко с вариантами копирования. Если мышкой тянуть, то никакого запроса не будет, но я то, как и многие, привык топтать клаву . Вот потому и удобно иметь откомпилированный скрипт под рукой. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Вахмурка
![](images/avatars/3414476054480a72d7cff1.gif)
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Igor_A.
![](images/avatars/14412142774bc9e597bbe1c.jpg)
Joined: 23 Mar 2006 Posts: 83
|
(Separately) Posted: Thu Sep 07, 2006 20:51 Post subject: |
|
|
Ага. А весит этот паверпро сколько?!
А откомпилированный экзешник со скриптом - около 180 кило примерно. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Вахмурка
![](images/avatars/3414476054480a72d7cff1.gif)
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
(Separately) Posted: Fri Sep 08, 2006 16:45 Post subject: |
|
|
"Весит" - в смысле дистрибутив? Какая разница? Важно, сколько прога жрет оперативки. PowerPro около 1.5 метров. При этом у тебя - менеджеры: горячих клавиш, буфера обмена, операций с мышью, виртуальных рабочих столов, скриптов, менюшек, панелей, трея, окон, таймеров, планировщика... (еще примерно "полстолька" остального, лень все перечислять). Посмотри ради прикола, сколько отъедает оперативки твой скрипт.
Помимо этого, избавившись от запроса на копирование, ты лишаешь себя кучи полезных свойств. Во-первых, очередь. Во-вторых, нажми кнопку "Options..." и посмотри, сколько там всего. В-третьих, тебе никогда не приходилось копировать (а скорее перемещать) что-то туда, где оно ну никак не должно находиться?! Запрос - еще одна гарантия. Именно по этим соображениям, полагаю, Гислер и не ввел возможность отмены запроса. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|