LonerD

|
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. Переименование файлов теперь работает через тоталовскую команду. _________________ Windows 11 | TC DreamLair eternal pre-α
Last edited by LonerD on Sun Jun 15, 2014 03:34; edited 7 times in total |
|