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 

AHK: Активация файловой панели при наведении мыши
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Mon Jun 09, 2014 17:41    Post subject: AHK: Активация файловой панели при наведении мыши Reply with quote

На соседнем форуме была поднята тема, захотелось реализовать. Как выяснилось - всё несколько сложнее чем казалось вначале. Просто передавать фокус панели Тотала (и даже запрашивать фокус) просто так невозможно - Тотал блокирует работу мыши (хотя скажем в проводнике 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
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Jun 13, 2014 18:28    Post subject: Reply with quote

Интересно, но пользы не нахожу. Даже мешает, когда мышь тянешь на тулбар, чтобы выполнить команду для выбранного в исходной панели. Приходится огибать по границе с вышестоящими компонентами окна.
Реальная польза была бы от активации панели в режиме быстрого просмотра.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Fri Jun 13, 2014 19:22    Post subject: Reply with quote

Если звёзды зажигают, то это кому-то нужно.
Был запрос на руборде, вот и стало интересно реализовать исключительно возможностями скриптового языка (без использования доп.программ и плагинов). Ещё интересней стало, когда выяснилось, что не всё так просто - Тотал (в отличие от Проводника) не позволяет безнаказанно получать/передавать фокус панелям, плюс названия классов панелей меняются после открыти фтп/включение дерева.
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Jun 13, 2014 19:27    Post subject: Reply with quote

LonerD wrote:
без использования доп.программ
Неужто?
Про остальное я в курсе. Т.е. правильно я понял, тут дело не в практичной полезности конкретного скрипта, а в потенциальном заимствовании кусков кода?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Fri Jun 13, 2014 20:11    Post subject: Reply with quote

Flasher wrote:
LonerD wrote:
без использования доп.программ
Неужто?

Если откомпилировать - то да, будет работать на чистом Тотале без использования доп.программ (собственно, ты и сам из кода видишь это). Если не компилировать - то нужен один exe-файл - портабельный интерпретатор языка.

Flasher wrote:
Т.е. правильно я понял, тут дело не в практичной полезности конкретного скрипта, а в потенциальном заимствовании кусков кода?

Кому такой скрипт полезен - могут его использовать (как я написал в предыдущем посте - идея не моя, был запрос на такой скрипт).
Лично мне такой скрипт неудобен в работе (прежде всего потому, что перестаёт работать возможность перемещения/копирования файлов мышью). Но фрагмент кода с определением контролов панелей уже нашёл своё место в другом скрипте (прокрутка вкладок панелей).
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Jun 13, 2014 20:21    Post subject: Reply with quote

LonerD wrote:
нужен один exe-файл - портабельный интерпретатор языка
Собственно, это и есть дополнительная программа, не встроенная в винду, как и скомпиленная.
LonerD wrote:
перестаёт работать возможность перемещения/копирования файлов мышью
Ага, ещё одна проблема. Хотя её можно решить запретом активности при удерживании ЛКМ.
LonerD wrote:
прокрутка вкладок панелей
Тот вариант менее глючен, чем TabControl.exe? Если да, то выложи где-нибудь.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Sat Jun 14, 2014 02:43    Post subject: Reply with quote

Flasher
Мудрые речи глаголешь Smile
Дополнил скрипт. Теперь при зажатой левой кнопке мыши не происходит считывания её положения и активация панели. Также при кратковременном движении мыши над файловой панелью даже без нажатых кнопок - ничего не приосходит. Сравнивается положение мыши в начальный момент и через заданный промежуток времени (параметр Sleep, можно изменить при необходимости), и если за этот промежуток положение курсора не изменилось (мышь всё над одной и той же панелью) - тогда происходит активация панели.

Flasher wrote:
Тот вариант менее глючен, чем TabControl.exe? Если да, то выложи где-нибудь.

TabControl если правильно помню - это скомпилированный вариант от Balderstrom. А у меня, скажем так, - доработанный вариант с учётом битности Тотала, смещения панелей... Почти выложил, но обнаружил ещё одно смещение панелей, скрипт отправился на временную доработку.
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sat Jun 14, 2014 11:54    Post subject: Reply with quote

LonerD
Не хочет работать (Win 7 x32).
Почему, кстати, директивы убрал?
Add: после правки заработал. Паузу всё равно надо больше делать при больших расширениях экрана и со скоростью движения курсора ниже 3000 dpi.
Тут ещё про один баг забыл написать: переименование файла (1007) слетает.

В Tabcontrol есть конкретные глюки с прокруткой в TC.
1. Если я ставлю курсор на одном из ушек по левую сторону от середины панели, то перехода не происходит.
2. Вместо прокрутки отображаемой страницы табы прокручиваются, когда переводишь курсор на панель быстрого просмотра вне зависимости от её активации. А если таки активировал, то при прокрутке, ко всему прочему, происходит временная активация обеих панелей. Smile

Также не учтена прокрутка табов неактивной панели.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Sat Jun 14, 2014 18:24    Post subject: Reply with quote

Flasher
Quote:
Не хочет работать ... Почему, кстати, директивы убрал?

Потому и не хочет работать, что убрал. А убрал потому, что недокопипастил )) Исправил.

Quote:
В Tabcontrol есть конкретные глюки с прокруткой в TC.
1. Если я ставлю курсор на одном из ушек по левую сторону от середины панели

Скачал я этот TabControl. Хитрая штука... Интересно, кто автор компиляции? Это AHK-скрипт (по принципу работы похож на скрипт от Balderstrom, скорее всего он и есть), но каким-то образом ехе сжат пакером, и после распаковки не запускается, выдаёт сообщение, что ехе повреждён, и секция RCData в ресурсах отсутствует (секция с исполняемым кодом).
В скрипте не учтены разные варианты положения контролов - с включённой и отключённой опцией DriveCombo, с деревьями каталогов в отдельных панелях, с запущенным фтп в процессе сеанса работы.

Quote:
панель быстрого просмотра

Мдя... А тут сложнее... малыми силами побороть не удастся.

_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sat Jun 14, 2014 20:27    Post subject: Reply with quote

LonerD wrote:
Исправил.
А по переименованию и быстрому поиску что?
И заметил ещё вещь. Это режим подходит только чистым мышатникам, т.к. когда начинаешь пользоваться навигацией с клавиатуры, то вместо нажатия Tab придётся всё время переводить мышиный курсор на нужную панель и стараться не смещать в другую. Это крайне неудобно. А вообще, конечно, не мешает добавить переброс курсора в крайний пиксель другой панели. при нажатии Tab, но активировать при этом моментально, т.е. без задержки.
Есть ещё проблема с быстрым просмотром, где в некоторых плагинах (например, в IniEd) активация прыгает то туда, то сюда.

LonerD wrote:
Скачал я этот TabControl.
В смысле "скачал"? Ты его раньше и выкладывал. Very Happy
LonerD wrote:
малыми силами побороть не удастся.
Придётся. Иначе в таком виде не годится.
А в чём суть проблемы? Там же один класс - TMyTabControl. А в быстром уже иной.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Sun Jun 15, 2014 04:19    Post subject: Reply with quote

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
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sun Jun 15, 2014 12:10    Post subject: Reply with quote

LonerD wrote:
По быстрому поиску - вроде всё нормально.
Как же? Окно ввода при наборе текста пропадает, если мышиный курсор на файловой панели. Сбивка фокуса касается и строки заголовка панели, и командной строки в том числе.
LonerD wrote:
пока не понял как выставить задержку при быстрой навигации
Что такое быстрая навигация, и зачем там задержка?

LonerD wrote:
Вот как-раз таки в быстром просмотре (листером) - класс TMyTabControl.
С чего бы? Всегда был TLister.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Sun Jun 15, 2014 15:20    Post subject: Reply with quote

Flasher wrote:
Окно ввода при наборе текста пропадает, если мышиный курсор на файловой панели. Сбивка фокуса касается и строки заголовка панели, и командной строки в том числе.

Не знаю, что можно сделать и не думаю, что что-то можно. Добавил проверки, но всё-равно если они попадают на таймер - то происходит активация панели. Видимо, проверки не могут отработать мгновенно. Пока вызывается окошко переименования/ком.строки, пока проверяется его активность - скрипт продолжает выполняться дальше

Flasher wrote:
Что такое быстрая навигация, и зачем там задержка?

Имел в виду - быстрое проведение курсора мыши к меню или панели инструментов над неактивной файловой панелью без активации этой панели.

Flasher wrote:
С чего бы? Всегда был TLister.

Не знаю как было всегда. Но сейчас TLister - это нижняя часть окна быстрого просмотра с открытым Листером. А верхняя часть окна - TMyTabControl. Neutral И прокрутка окна/панели быстрого просмотра нормально работает если подвести курсор мыши к нижней части окна/панели быстрого просмотра.
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sun Jun 15, 2014 15:55    Post subject: Reply with quote

LonerD wrote:
Добавил проверки, но всё-равно если они попадают на таймер
Условия должны быть в начале кода после проверки активности окна ТС. Быстрый поиск можно отслеживать по наличию окна. Комстроку - тоже, но при +2 в ключе RestrictInterface. А с заголовком - сложнее. Тут можно отслеживать вызов команды и нажатие Enter/галочки на выполнение, а до тех пор никаких действий не производить.
LonerD wrote:
Имел в виду - быстрое проведение курсора мыши к меню или панели инструментов над неактивной файловой панелью без активации этой панели.
Тут, ИМХО, тоже лучше делать по описанию выше. Гонять курсор туда-сюда неправильно.
LonerD wrote:
А верхняя часть окна - TMyTabControl.
Можно пруфскрин при чистом конфиге увидеть?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Sun Jun 15, 2014 17:36    Post subject: Reply with quote

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
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  Next
Page 1 of 2

 
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