View previous topic :: View next topic |
Author |
Message |
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Mon Jun 16, 2014 05:20 Post subject: AHK: Прокрутка вкладок панелей колёсиком (тачем) мыши |
|
|
Code: | ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Прокрутка вкладок файловых панелей колёсиком (или тачем) мыши
; Скрипт создан для сборки TC DreamLair 2015
; Версия скрипта: 1.71
; Дата создания: 2014.06.15
; Автор скрипта: LonerD
; Фрагменты кода: Balderstrom, YMP и др.
; Сайт: http://dreamlair.net
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; В скрипте учтены следующие нюансы:
; - работа с активным окном Тотала (32 и 64 бита) (только если у них один конфиг-файл);
; - работа при нескольких запущенных копиях Тотала (только если у них один конфиг-файл);
; - работа при открытом/закрытом ftp-соединении;
; - работа при открытых деревьях в файловых панелях;
; - вращение колёсика под файловыми панелями.
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#NoEnv
#NoTrayIcon
#KeyHistory, 0
#InstallMouseHook
#SingleInstance, force
SetBatchLInes, -1
SendMode Input
#IfWinActive, ahk_class TTOTAL_CMD
{
WheelDown::
WheelUp::
{
WinGet, TCHWND, ID, A
ControlGetFocus, aControl, % "ahk_id " TCHWND
MouseGetPos,,,, mControl
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WinGet, TCPID, PID, A
TCArch := GetBitness(TCPID)
EnvGet, commander_path, commander_path
EnvGet, commander_ini, commander_ini
IniRead, RedirectLayout, % commander_ini, Layout, RedirectSection, 0
Transform, LayoutINI, Deref, % (RedirectLayout ? RedirectLayout : commander_ini)
LayoutINI := ExpandEnvVars (LayoutINI)
IniRead, DriveCombo, % LayoutINI, Layout, DriveCombo, 1
TMyTabControl1 := TCArch=32 ? "TMyTabControl1":"SysTabControl321"
TMyTabControl2 := TCArch=32 ? "TMyTabControl2":"SysTabControl322"
if ( DriveCombo = 0 )
{
TDrivePanel2 := TCArch=32 ? "TDrivePanel2":"Window5"
TMyPanel2 := TCArch=32 ? "TMyPanel2":"Window6"
TDrivePanel1 := TCArch=32 ? "TDrivePanel1":"Window3"
TMyPanel1 := TCArch=32 ? "TMyPanel1":"Window4"
TMyPanel6 := TCArch=32 ? "TMyPanel6":"Window10"
TMyPanel7 := TCArch=32 ? "TMyPanel7":"Window11"
TMyPanel9 := TCArch=32 ? "TMyPanel9":"Window15"
TMyPanel10 := TCArch=32 ? "TMyPanel10":"Window16"
}
else
{
TDrivePanel2 := TCArch=32 ? "TDrivePanel2":"Window4"
TMyPanel6 := TCArch=32 ? "TMyPanel6":"Window12"
TDrivePanel1 := TCArch=32 ? "TDrivePanel1":"Window3"
TMyPanel9 := TCArch=32 ? "TMyPanel9":"Window17"
TMyPanel4 := TCArch=32 ? "TMyPanel4":"Window8"
TMyPanel5 := TCArch=32 ? "TMyPanel5":"Window9"
TMyPanel7 := TCArch=32 ? "TMyPanel7":"Window13"
TMyPanel8 := TCArch=32 ? "TMyPanel8":"Window14"
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Loop, 3
TMyListBox%A_Index% := TCArch=32 ? "TMyListBox" . (SeparateTree + A_Index):"LCLListBox" . (SeparateTree + A_Index)
WinGet, TCControls, ControlList, % "ahk_id " TCHWND
TCFTPMode := 0
Loop, Parse, TCControls, `n, `r
{
if ( A_LoopField = TMyListBox3 )
{
TCFTPMode := 1
break
}
}
TMyListBoxL := TCArch=32 ? "TMyListBox" . (2 + SeparateTree + TCFTPMode):"LCLListBox" . (2 + SeparateTree + TCFTPMode)
TMyListBoxR := TCArch=32 ? "TMyListBox" . (1 + SeparateTree + TCFTPMode):"LCLListBox" . (1 + SeparateTree + TCFTPMode)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if( mControl = TDrivePanel2 || mControl = TMyPanel2 || mControl = TMyPanel6 || mControl = TMyPanel4 || mControl = TMyPanel5 ) ; || mControl = TMyTabControl1 )
{
DllCall("LockWindowUpdate", "uint", TCHWND)
TCTabScroll( A_ThisHotkey, (aControl != TMyListBoxL), 4001, 4002 )
DllCall("LockWindowUpdate", "uint", 0)
}
else if( mControl = TDrivePanel1 || mControl = TMyPanel1 || mControl = TMyPanel9 || mControl = TMyPanel10 || mControl = TMyPanel8 ) ; || mControl = TMyTabControl2 )
{
DllCall("LockWindowUpdate", "uint", TCHWND)
TCTabScroll( A_ThisHotkey, (aControl != TMyListBoxR), 4002, 4001 )
DllCall("LockWindowUpdate", "uint", 0)
}
else if( mControl = TMyPanel7 )
{
DllCall("LockWindowUpdate", "uint", TCHWND)
if ( DriveCombo = 0 )
TCTabScroll( A_ThisHotkey, (aControl != TMyListBoxL), 4001, 4002 )
else
TCTabScroll( A_ThisHotkey, (aControl != TMyListBoxR), 4002, 4001 )
DllCall("LockWindowUpdate", "uint", 0)
}
else
Send, {%A_ThisHotkey%}
Return
}
Return
}
#IfWinActive
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TCTabScroll( key, panelCheck, pane1, pane2 )
{
cmd := (key == "WheelUp" ? 3005 : 3006)
if( panelCheck )
{
PostMessage, 0x433, pane1
Sleep, 50
PostMessage, 0x433, cmd
PostMessage, 0x433, pane2
}
else
PostMessage, 0x433, cmd
Sleep, 100
Return
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GetBitness(Process) {
Process, Exist, %Process%
If !(PID := ErrorLevel)
return 0
hProcess := DllCall("OpenProcess", "uint", 0x400
, "uint", 0, "uint", PID, "ptr")
If (hProcess = 0)
return 0
res := DllCall("IsWow64Process", "ptr", hProcess, "int *", Wow64Process)
If (res = 0)
return 0
DllCall("CloseHandle", "ptr", hProcess)
return Wow64Process? 32:64
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ExpandEnvVars(ppath)
{
VarSetCapacity(Dest, 2000)
DllCall("ExpandEnvironmentStrings", Str, ppath, Str, Dest, Int, 1998)
Return, Dest
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
Upd 1.71 Подправлена работа при отсутствии секции Layout. _________________ Windows 11 | TC DreamLair eternal pre-α
Last edited by LonerD on Mon Jun 16, 2014 22:47; edited 1 time in total |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Mon Jun 16, 2014 13:54 Post subject: |
|
|
AutoHotkey_L Unicode 32-bit 1.1.08.01. Win XP/7 x32. Прокрутки нет. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Mon Jun 16, 2014 16:21 Post subject: |
|
|
Жаль.
Скинь свои настройки wincmd.ini., может названия классов контролов другие при таких настройках. _________________ Windows 11 | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Mon Jun 16, 2014 17:23 Post subject: |
|
|
LonerD wrote: | может названия классов контролов другие при таких настройках | Быть того не может.
Конфиг я чистый пробовал, так что не судьба. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Mon Jun 16, 2014 19:22 Post subject: |
|
|
Flasher
Ага, понял. В конфиг-файле чистого Тотала нет секции [Layout]. Галочки в настройках стоят, но записей в ini-файле нет, секция появится только после того, как поставить/снять вручную галочки в настройках
Поправил.
Заметил ещё одно ограничение. Скрипт работает с несколькими запущенными копиями Тотала только в том случае, если у них один и тот же файл конфигурации. Иначе возможны проблемы. (из-за разного положения контролов окна).
Как определить местоположение файла конфигурации для активного окна Тотала - вопрос на засыпку. Нашёл только какие-то прямые решения на С, в общем не осилю. Значит, буду решать вопрос по старинке... _________________ Windows 11 | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Jun 17, 2014 00:07 Post subject: |
|
|
LonerD
В общем, у меня как не работало, так и не работает.
LonerD wrote: | Как определить местоположение файла конфигурации для активного окна Тотала - вопрос на засыпку. | Любая копия имеет заголовок с присвоенным номером. Считываешь PID процесса и смотришь в нём переменную COMMANDER_INI.
Либо можно считывать путь из комстроки. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Tue Jun 17, 2014 02:39 Post subject: |
|
|
Flasher wrote: | LonerD
В общем, у меня как не работало, так и не работает. |
Тогда не знаю. На Win8.1x64SL на чистом Тотале у меня отрабатывает. Подожду ещё отзывов.
Flasher wrote: | Считываешь PID процесса и смотришь в нём переменную COMMANDER_INI. |
Вот тут-то и проблемка. Как по PID узнать внутреннюю переменную окружения?
Нашёл темы без ответа - вот и вот.
На руфоруме не помогли.
Путь к каталогу с процессом по PID можно узнать, ком.строку можно. А вот commander_ini -
Flasher wrote: | Либо можно считывать путь из комстроки. |
Это вижу единственным способом:
1) проверять наличие комстроки, парсить её на наличие пути;
2) проверять наличие файла wincmd.ini в каталоге с Тоталом, ключа UseIniInProgramDir в нём;
3) каталог %userprofile%\Ghisler
4) ключ реестра HKEY_CURRENT_USER\Software\Ghisler\Total Commander.
5) каталог %WINDIR%
Вроде такой порядок? _________________ Windows 11 | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Jun 17, 2014 06:47 Post subject: |
|
|
LonerD wrote: | Как по PID узнать внутреннюю переменную окружения? | Это смотрел?
1) Сначала - на наличие там /i=.
Порядок вроде бы тот. Но надо ли заморачиваться с непортабельными версиями - даже не знаю. Кто из их пользователей будет данный скрипт использовать - большой вопрос. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Tue Jun 17, 2014 19:41 Post subject: |
|
|
LonerD wrote: |
Вот тут-то и проблемка. Как по PID узнать внутреннюю переменную окружения?
|
А зачем? Если скрипт запущен из ТС, то все %COMMANDER_*% будут наследованы от родительского процесса (а я не вижу иного способа, как запускать скрипт плагином AutoRun). |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Jun 17, 2014 20:46 Post subject: |
|
|
Skif_off wrote: | Если скрипт запущен из ТС, то все %COMMANDER_*% будут наследованы от родительского процесса | #SingleInstance, force - только для повторных запусков, а новые процессы разных ТС могут запускаться без них. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Tue Jun 17, 2014 23:42 Post subject: |
|
|
Flasher
Заменить на off, а скрипт запускать с передачей %AUTORUN_TCPID% параметром запуска?
Тогда каждую версию скрипта можно привязать к своему PID. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Wed Jun 18, 2014 00:28 Post subject: |
|
|
Flasher wrote: | Это смотрел? |
Судя по теме на скрипт-форуме, всё чересчур сложно...
Flasher wrote: | надо ли заморачиваться с непортабельными версиями - даже не знаю. Кто из их пользователей будет данный скрипт использовать - большой вопрос. |
Тоже большой вопрос. Потому пока не спешу заморачиваться. Может, со временем сделаю.
Skif_off wrote: | Flasher
Заменить на off, а скрипт запускать с передачей %AUTORUN_TCPID% параметром запуска?
Тогда каждую версию скрипта можно привязать к своему PID. |
Цель не в том, чтобі привязывать скрипт к PIDам, а наоборот - отвязать, чтобы работал с любым окном Тотала.
Мы запускаем Тотал, запускаем из-под него скрипт. Дальше запускаем другой Тотал из другого каталога с другими настройками. Так вот со вторым Тоталом скрипт полноценно не может работать. Там нужно всего-то одну настройку считать из файла конфигурации, но простым путём мы не можем узнать расположение файла конфигурации второго Тотала.
PS. Как вариант - ещё перебор контролов окон. Это не добавит скорости скрипту, но наверное всё-же быстрее будет, чем каждый раз елозить ini-файл. _________________ Windows 11 | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Jun 18, 2014 10:30 Post subject: |
|
|
LonerD wrote: | Судя по теме на скрипт-форуме, всё чересчур сложно... | Сложно. Но результат есть, надо с ним пробовать. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Jun 22, 2014 17:07 Post subject: |
|
|
LonerD
Скинь, пож-та, в спойлер секции, при которых у тебя всё работает. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Tue Jun 24, 2014 04:49 Post subject: |
|
|
У меня работает с простейшим вариантом:
Code: | [Configuration]
UseIniInProgramDir=7
|
Запускаем Тотал (чистый), кликаем ОК, Ctrl+T на одной панели и на второй, и из-под этого Тотала запускаем скрипт.
Или вот вариант с панелями:
Code: | [Configuration]
UseIniInProgramDir=7
UseNewDefFont=0
firstmnu=3002
FirstTime=0
test=216
SeparateTree=0
PanelsVertical=0
[left]
path=c:\
ShowAllDetails=1
SpecialView=0
show=1
sortorder=0
negative Sortorder=0
[right]
path=c:\
ShowAllDetails=1
SpecialView=0
show=1
sortorder=0
negative Sortorder=0
[lefttabs]
0_path=c:\
0_options=1|0|0|0|0|0|0
activetab=1
[righttabs]
0_path=c:\
0_options=1|0|0|0|0|0|0
activetab=1
[RightHistory]
0=c:\
[LeftHistory]
0=c:\
[Layout]
ButtonBar=1
DriveBar1=1
DriveBar2=0
DriveBarFlat=1
InterfaceFlat=1
DriveCombo=1
DirectoryTabs=1
XPthemeBg=1
CurDir=1
TabHeader=1
StatusBar=1
CmdLine=1
KeyButtons=1
HistoryHotlistButtons=1
BreadCrumbBar=1 |
А спойлер - это spoiler? Что-то не срабатывает такой тег. _________________ Windows 11 | 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
|