View previous topic :: View next topic |
Author |
Message |
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Mon Jun 09, 2014 17:41 Post subject: AHK: Активация файловой панели при наведении мыши |
|
|
На соседнем форуме была поднята тема, захотелось реализовать. Как выяснилось - всё несколько сложнее чем казалось вначале. Просто передавать фокус панели Тотала (и даже запрашивать фокус) просто так невозможно - Тотал блокирует работу мыши (хотя скажем в проводнике Windows никаких проблем не возникает).
Потому в скрипте реализован другой подход, основанный на отсылке Тоталу встроенных команд.
В скрипте учтены варианты работы с деревом в файловой панели/двумя деревьями, а также с возможностью запуска ftp-соединения в текущем сеансе работы пользователя (то есть учтены варианты с изменением имён классов контролов файловых панелей).
Code: | ;================================================================
; Сделать файловую панель активной при наведении на неё курсора мыши
; Версия скрипта: 1.3
; Дата создания: 2014.06.15
; Автор скрипта: LonerD
; Идея и помощь: OnMyDSeeAtAll
; Сайт: http://dreamlair.net
;================================================================
; WM_USER+51 = 1075
; cm_FocusRight = 4002
; cm_FocusLeft = 4001
;================================================================
#NoEnv
#NoTrayIcon
#Persistent
#KeyHistory, 0
#SingleInstance, force
ListLines, Off
SetTimer, mTimer, 1000
mTimer:
If WinActive("ahk_class TTOTAL_CMD")
{
GetKeyState, LBState, LButton, P
ControlGet, Editmode32, Visible,, TInEdit1, A
ControlGet, Editmode64, Visible,, Edit1, A
if ( LBState != D ) and ( Editmode32 = 0 ) and ( Editmode64 = 0 )
{
MouseGetPos,,,, mControl
if ( mControl ~= "ListBox" )
{
WinGet, TCHWND, ID, A
SeparateTree := 0
Loop, 3
{
ControlGetText, TMyText%A_Index%, TMyListBox%A_Index%, % "ahk_id " TCHWND
ControlGetText, LCLText%A_Index%, LCLListBox%A_Index%, % "ahk_id " TCHWND
if ( TMyText%A_Index% = "W_TreeList2" || LCLText%A_Index% = "W_TreeList2" )
{
SeparateTree := 2
break
}
else if ( TMyText%A_Index% = "W_TreeList1" || LCLText%A_Index% = "W_TreeList1" )
SeparateTree := 1
}
Loop, 3
{
TMyListBox%A_Index% := "ListBox" (SeparateTree + A_Index)
}
Sleep, 500
MouseGetPos,,,, mControl2
if ( mControl2 = mControl )
{
if ( mControl ~= TMyListBox1 )
PostMessage, 1075, 4002,,, % "ahk_id " TCHWND
else if ( mControl ~= TMyListBox3 )
PostMessage, 1075, 4001,,, % "ahk_id " TCHWND
else if ( mControl ~= TMyListBox2 )
{
WinGet, TCControls, ControlList, % "ahk_id " TCHWND
TCFTPMode := 0
Loop, Parse, TCControls, `n, `r
{
if ( A_LoopField ~= TMyListBox3 )
{
TCFTPMode := 1
break
}
}
PostMessage, 1075, 400 (TCFTPMode="1" ? 2:1),,, % "ahk_id " TCHWND
}
}
}
}
}
Exit, (mControl) And mControl:="" |
Upd 1.15. Более корректная работа с активным окном Тотала (если открыто несколько окон), плюс небольшая правка синтаксиса.
Upd 1.2. Исправлено поведении при нажатой левой кнопке мыши (перемещение, копирование между панелями), а также подправлено поведение при кратковременном движении мыши над файловой панелью (например, для доступа к панели инструменов, меню и т.д...).
Upd 1.3. Переименование файлов теперь работает через тоталовскую команду. _________________ Win11 x64 Eng | TC DreamLair eternal pre-α
Last edited by LonerD on Sun Jun 15, 2014 03:34; edited 7 times in total |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Jun 13, 2014 18:28 Post subject: |
|
|
Интересно, но пользы не нахожу. Даже мешает, когда мышь тянешь на тулбар, чтобы выполнить команду для выбранного в исходной панели. Приходится огибать по границе с вышестоящими компонентами окна.
Реальная польза была бы от активации панели в режиме быстрого просмотра. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Fri Jun 13, 2014 19:22 Post subject: |
|
|
Если звёзды зажигают, то это кому-то нужно.
Был запрос на руборде, вот и стало интересно реализовать исключительно возможностями скриптового языка (без использования доп.программ и плагинов). Ещё интересней стало, когда выяснилось, что не всё так просто - Тотал (в отличие от Проводника) не позволяет безнаказанно получать/передавать фокус панелям, плюс названия классов панелей меняются после открыти фтп/включение дерева. _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Jun 13, 2014 19:27 Post subject: |
|
|
LonerD wrote: | без использования доп.программ | Неужто?
Про остальное я в курсе. Т.е. правильно я понял, тут дело не в практичной полезности конкретного скрипта, а в потенциальном заимствовании кусков кода? _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Fri Jun 13, 2014 20:11 Post subject: |
|
|
Flasher wrote: | LonerD wrote: | без использования доп.программ | Неужто? |
Если откомпилировать - то да, будет работать на чистом Тотале без использования доп.программ (собственно, ты и сам из кода видишь это). Если не компилировать - то нужен один exe-файл - портабельный интерпретатор языка.
Flasher wrote: | Т.е. правильно я понял, тут дело не в практичной полезности конкретного скрипта, а в потенциальном заимствовании кусков кода? |
Кому такой скрипт полезен - могут его использовать (как я написал в предыдущем посте - идея не моя, был запрос на такой скрипт).
Лично мне такой скрипт неудобен в работе (прежде всего потому, что перестаёт работать возможность перемещения/копирования файлов мышью). Но фрагмент кода с определением контролов панелей уже нашёл своё место в другом скрипте (прокрутка вкладок панелей). _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Jun 13, 2014 20:21 Post subject: |
|
|
LonerD wrote: | нужен один exe-файл - портабельный интерпретатор языка | Собственно, это и есть дополнительная программа, не встроенная в винду, как и скомпиленная.
LonerD wrote: | перестаёт работать возможность перемещения/копирования файлов мышью | Ага, ещё одна проблема. Хотя её можно решить запретом активности при удерживании ЛКМ.
LonerD wrote: | прокрутка вкладок панелей | Тот вариант менее глючен, чем TabControl.exe? Если да, то выложи где-нибудь. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Sat Jun 14, 2014 02:43 Post subject: |
|
|
Flasher
Мудрые речи глаголешь
Дополнил скрипт. Теперь при зажатой левой кнопке мыши не происходит считывания её положения и активация панели. Также при кратковременном движении мыши над файловой панелью даже без нажатых кнопок - ничего не приосходит. Сравнивается положение мыши в начальный момент и через заданный промежуток времени (параметр Sleep, можно изменить при необходимости), и если за этот промежуток положение курсора не изменилось (мышь всё над одной и той же панелью) - тогда происходит активация панели.
Flasher wrote: | Тот вариант менее глючен, чем TabControl.exe? Если да, то выложи где-нибудь. |
TabControl если правильно помню - это скомпилированный вариант от Balderstrom. А у меня, скажем так, - доработанный вариант с учётом битности Тотала, смещения панелей... Почти выложил, но обнаружил ещё одно смещение панелей, скрипт отправился на временную доработку. _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sat Jun 14, 2014 11:54 Post subject: |
|
|
LonerD
Не хочет работать (Win 7 x32).
Почему, кстати, директивы убрал?
Add: после правки заработал. Паузу всё равно надо больше делать при больших расширениях экрана и со скоростью движения курсора ниже 3000 dpi.
Тут ещё про один баг забыл написать: переименование файла (1007) слетает.
В Tabcontrol есть конкретные глюки с прокруткой в TC.
1. Если я ставлю курсор на одном из ушек по левую сторону от середины панели, то перехода не происходит.
2. Вместо прокрутки отображаемой страницы табы прокручиваются, когда переводишь курсор на панель быстрого просмотра вне зависимости от её активации. А если таки активировал, то при прокрутке, ко всему прочему, происходит временная активация обеих панелей.
Также не учтена прокрутка табов неактивной панели. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Sat Jun 14, 2014 18:24 Post subject: |
|
|
Flasher
Quote: | Не хочет работать ... Почему, кстати, директивы убрал? |
Потому и не хочет работать, что убрал. А убрал потому, что недокопипастил )) Исправил.
Quote: | В Tabcontrol есть конкретные глюки с прокруткой в TC.
1. Если я ставлю курсор на одном из ушек по левую сторону от середины панели |
Скачал я этот TabControl. Хитрая штука... Интересно, кто автор компиляции? Это AHK-скрипт (по принципу работы похож на скрипт от Balderstrom, скорее всего он и есть), но каким-то образом ехе сжат пакером, и после распаковки не запускается, выдаёт сообщение, что ехе повреждён, и секция RCData в ресурсах отсутствует (секция с исполняемым кодом).
В скрипте не учтены разные варианты положения контролов - с включённой и отключённой опцией DriveCombo, с деревьями каталогов в отдельных панелях, с запущенным фтп в процессе сеанса работы.
Quote: | панель быстрого просмотра |
Мдя... А тут сложнее... малыми силами побороть не удастся. _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sat Jun 14, 2014 20:27 Post subject: |
|
|
А по переименованию и быстрому поиску что?
И заметил ещё вещь. Это режим подходит только чистым мышатникам, т.к. когда начинаешь пользоваться навигацией с клавиатуры, то вместо нажатия Tab придётся всё время переводить мышиный курсор на нужную панель и стараться не смещать в другую. Это крайне неудобно. А вообще, конечно, не мешает добавить переброс курсора в крайний пиксель другой панели. при нажатии Tab, но активировать при этом моментально, т.е. без задержки.
Есть ещё проблема с быстрым просмотром, где в некоторых плагинах (например, в IniEd) активация прыгает то туда, то сюда.
LonerD wrote: | Скачал я этот TabControl. | В смысле "скачал"? Ты его раньше и выкладывал.
LonerD wrote: | малыми силами побороть не удастся. | Придётся. Иначе в таком виде не годится.
А в чём суть проблемы? Там же один класс - TMyTabControl. А в быстром уже иной. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Sun Jun 15, 2014 04:19 Post subject: |
|
|
Flasher wrote: | А по переименованию и быстрому поиску что? |
По быстрому поиску - вроде всё нормально.
А вот с переименованием - дела не очень гладки...Выход вижу в том, чтобы добавить проверку на наличие видимых контролов переименования TInEdit1 (и Edit1 - в 64-х битной версии). Вначале проверяем - видимы они или нет, и если невидимы - тогда продолжаем работу скрипта. Не очень помогает. Чересчур долго они проверяются, за это время остальная часть скрипта успевает отработать. Пришлось увеличивать время таймера.((
Flasher wrote: | А вообще, конечно, не мешает добавить переброс курсора в крайний пиксель другой панели. при нажатии Tab, но активировать при этом моментально, т.е. без задержки. |
Думал об этом. Пока не знаю как сделать
PS. Оказывается, есть гораздо более элегантное решение табуляции и переименования (правда, пока не понял как выставить задержку при быстрой навигации).
Flasher wrote: | В смысле "скачал"? Ты его раньше и выкладывал. |
Я им давно в том виде не пользуюсь. Если правильно помню, впервые я TabControl заприметил в сборке кракловера. Кто компилил - не знаю, возможно сам Игорь.
Flasher wrote: | Там же один класс - TMyTabControl. А в быстром уже иной. |
Вот как-раз таки в быстром просмотре (листером) - класс TMyTabControl. Так что придётся или как-то определять, что активирован режим быстрого просмотра (пока не знаю как это сделать) или пожертвовать этим классом. _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Jun 15, 2014 12:10 Post subject: |
|
|
LonerD wrote: | По быстрому поиску - вроде всё нормально. | Как же? Окно ввода при наборе текста пропадает, если мышиный курсор на файловой панели. Сбивка фокуса касается и строки заголовка панели, и командной строки в том числе.
LonerD wrote: | пока не понял как выставить задержку при быстрой навигации | Что такое быстрая навигация, и зачем там задержка?
LonerD wrote: | Вот как-раз таки в быстром просмотре (листером) - класс TMyTabControl. | С чего бы? Всегда был TLister. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Sun Jun 15, 2014 15:20 Post subject: |
|
|
Flasher wrote: | Окно ввода при наборе текста пропадает, если мышиный курсор на файловой панели. Сбивка фокуса касается и строки заголовка панели, и командной строки в том числе. |
Не знаю, что можно сделать и не думаю, что что-то можно. Добавил проверки, но всё-равно если они попадают на таймер - то происходит активация панели. Видимо, проверки не могут отработать мгновенно. Пока вызывается окошко переименования/ком.строки, пока проверяется его активность - скрипт продолжает выполняться дальше
Flasher wrote: | Что такое быстрая навигация, и зачем там задержка? |
Имел в виду - быстрое проведение курсора мыши к меню или панели инструментов над неактивной файловой панелью без активации этой панели.
Flasher wrote: | С чего бы? Всегда был TLister. |
Не знаю как было всегда. Но сейчас TLister - это нижняя часть окна быстрого просмотра с открытым Листером. А верхняя часть окна - TMyTabControl. И прокрутка окна/панели быстрого просмотра нормально работает если подвести курсор мыши к нижней части окна/панели быстрого просмотра. _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Jun 15, 2014 15:55 Post subject: |
|
|
LonerD wrote: | Добавил проверки, но всё-равно если они попадают на таймер | Условия должны быть в начале кода после проверки активности окна ТС. Быстрый поиск можно отслеживать по наличию окна. Комстроку - тоже, но при +2 в ключе RestrictInterface. А с заголовком - сложнее. Тут можно отслеживать вызов команды и нажатие Enter/галочки на выполнение, а до тех пор никаких действий не производить.
LonerD wrote: | Имел в виду - быстрое проведение курсора мыши к меню или панели инструментов над неактивной файловой панелью без активации этой панели. | Тут, ИМХО, тоже лучше делать по описанию выше. Гонять курсор туда-сюда неправильно.
LonerD wrote: | А верхняя часть окна - TMyTabControl. | Можно пруфскрин при чистом конфиге увидеть? _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Sun Jun 15, 2014 17:36 Post subject: |
|
|
Flasher wrote: | Условия должны быть в начале кода после проверки активности окна ТС. |
Так они и есть в начале кода.
Flasher wrote: | Можно пруфскрин при чистом конфиге увидеть? |
Можно. Вот и вот. (так как речь идёт о скрипте прокрутки вкладок, то разумеется в панелях открыты вкладки).
Дальнейшие обсуждения табов предлагаю продолжить в отдельной теме; сегодня выложу скрипт, тогда виднее будет что к чему.
Добавлено спустя 8 минут:
;================================================================
Альтернативный вариант скрипта, который реагирует только на движение мыши (через мышиный хук). Лишён некоторых проблем предыдущей версии. Если не двигать мышью - работают переименование файлов и прочие операции с текстовыми полями, работает навигация с клавиатуры... Но имеются некоторые свои проблемы - невозможно выставить задержку, панель активируется сразу при наведении. Скрипт "залипает" при активации некоторых других окон (например, на окно Оперы реагирует спокойно, а активация окна Акелпада действует на скрипт тлетворно). Может, кто знает как это побороть?
Code: |
;================================================================
; Сделать файловую панель активной при наведении на неё курсора мыши
; Альтернативный вариант
; Версия скрипта: 1.0a
; Дата создания: 2014.06.15
; Автор скрипта: LonerD
; Идея и помощь: OnMyDSeeAtAll
; Сайт: http://dreamlair.net
;================================================================
; WM_USER+51 = 1075
; cm_FocusRight = 4002
; cm_FocusLeft = 4001
;================================================================
#NoEnv
#NoTrayIcon
#Persistent
#KeyHistory, 0
#SingleInstance, force
ListLines, Off
hHookKeybd := DllCall("SetWindowsHookEx"
, Int, WH_MOUSE_LL := 14
, Int, RegisterCallback("LowLevelMouseProc", "Fast")
, UInt, DllCall("GetModuleHandle", UInt, 0)
, UInt, 0)
Return
LowLevelMouseProc(nCode, wParam, lParam)
{
If WinActive("ahk_class TTOTAL_CMD")
{
GetKeyState, LBState, LButton, P
if ( LBState != D )
{
MouseGetPos,,,, mControl
if ( mControl ~= "ListBox" )
{
WinGet, TCHWND, ID, A
SeparateTree := 0
Loop, 3
{
ControlGetText, TMyText%A_Index%, TMyListBox%A_Index%, % "ahk_id " TCHWND
ControlGetText, LCLText%A_Index%, LCLListBox%A_Index%, % "ahk_id " TCHWND
if ( TMyText%A_Index% = "W_TreeList2" || LCLText%A_Index% = "W_TreeList2" )
{
SeparateTree := 2
break
}
else if ( TMyText%A_Index% = "W_TreeList1" || LCLText%A_Index% = "W_TreeList1" )
SeparateTree := 1
}
Loop, 3
{
TMyListBox%A_Index% := "ListBox" (SeparateTree + A_Index)
}
if ( mControl ~= TMyListBox1 )
PostMessage, 1075, 4002,,, % "ahk_id " TCHWND
else if ( mControl ~= TMyListBox3 )
PostMessage, 1075, 4001,,, % "ahk_id " TCHWND
else if ( mControl ~= TMyListBox2 )
{
WinGet, TCControls, ControlList, % "ahk_id " TCHWND
TCFTPMode := 0
Loop, Parse, TCControls, `n, `r
{
if ( A_LoopField ~= TMyListBox3 )
{
TCFTPMode := 1
break
}
}
PostMessage, 1075, 400 (TCFTPMode="1" ? 2:1),,, % "ahk_id " TCHWND
}
}
}
}
} |
_________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
|
|
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
|