AHK: Прокрутка вкладок панелей колёсиком (тачем) мыши
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2  Next  :| |:
Total Commander -> Автоматизация Total Commander

#1: AHK: Прокрутка вкладок панелей колёсиком (тачем) мыши Author: LonerDLocation: Донецк PostPosted: Mon Jun 16, 2014 05:20
    —
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.


Last edited by LonerD on Mon Jun 16, 2014 22:47; edited 1 time in total

#2:  Author: FlasherLocation: Москва PostPosted: Mon Jun 16, 2014 13:54
    —
AutoHotkey_L Unicode 32-bit 1.1.08.01. Win XP/7 x32. Прокрутки нет.

#3:  Author: LonerDLocation: Донецк PostPosted: Mon Jun 16, 2014 16:21
    —
Жаль.
Скинь свои настройки wincmd.ini., может названия классов контролов другие при таких настройках.

#4:  Author: FlasherLocation: Москва PostPosted: Mon Jun 16, 2014 17:23
    —
LonerD wrote:
может названия классов контролов другие при таких настройках
Быть того не может.
Конфиг я чистый пробовал, так что не судьба.

#5:  Author: LonerDLocation: Донецк PostPosted: Mon Jun 16, 2014 19:22
    —
Flasher
Ага, понял. В конфиг-файле чистого Тотала нет секции [Layout]. Галочки в настройках стоят, но записей в ini-файле нет, секция появится только после того, как поставить/снять вручную галочки в настройках Smile
Поправил.

Заметил ещё одно ограничение. Скрипт работает с несколькими запущенными копиями Тотала только в том случае, если у них один и тот же файл конфигурации. Иначе возможны проблемы. (из-за разного положения контролов окна).

Как определить местоположение файла конфигурации для активного окна Тотала - вопрос на засыпку. Нашёл только какие-то прямые решения на С, в общем не осилю. Значит, буду решать вопрос по старинке...

#6:  Author: FlasherLocation: Москва PostPosted: Tue Jun 17, 2014 00:07
    —
LonerD
В общем, у меня как не работало, так и не работает.

LonerD wrote:
Как определить местоположение файла конфигурации для активного окна Тотала - вопрос на засыпку.
Любая копия имеет заголовок с присвоенным номером. Считываешь PID процесса и смотришь в нём переменную COMMANDER_INI.
Либо можно считывать путь из комстроки.

#7:  Author: LonerDLocation: Донецк PostPosted: Tue Jun 17, 2014 02:39
    —
Flasher wrote:
LonerD
В общем, у меня как не работало, так и не работает.

Тогда не знаю. На Win8.1x64SL на чистом Тотале у меня отрабатывает. Подожду ещё отзывов.

Flasher wrote:
Считываешь PID процесса и смотришь в нём переменную COMMANDER_INI.

Вот тут-то и проблемка. Как по PID узнать внутреннюю переменную окружения?
Нашёл темы без ответа - вот и вот.
На руфоруме не помогли.
Путь к каталогу с процессом по PID можно узнать, ком.строку можно. А вот commander_ini - Rolling Eyes

Flasher wrote:
Либо можно считывать путь из комстроки.

Это вижу единственным способом:
1) проверять наличие комстроки, парсить её на наличие пути;
2) проверять наличие файла wincmd.ini в каталоге с Тоталом, ключа UseIniInProgramDir в нём;
3) каталог %userprofile%\Ghisler
4) ключ реестра HKEY_CURRENT_USER\Software\Ghisler\Total Commander.
5) каталог %WINDIR%
Вроде такой порядок?

#8:  Author: FlasherLocation: Москва PostPosted: Tue Jun 17, 2014 06:47
    —
LonerD wrote:
Как по PID узнать внутреннюю переменную окружения?
Это смотрел?

1) Сначала - на наличие там /i=.

Порядок вроде бы тот. Но надо ли заморачиваться с непортабельными версиями - даже не знаю. Кто из их пользователей будет данный скрипт использовать - большой вопрос.

#9:  Author: Skif_off PostPosted: Tue Jun 17, 2014 19:41
    —
LonerD wrote:

Вот тут-то и проблемка. Как по PID узнать внутреннюю переменную окружения?

А зачем? Если скрипт запущен из ТС, то все %COMMANDER_*% будут наследованы от родительского процесса (а я не вижу иного способа, как запускать скрипт плагином AutoRun).

#10:  Author: FlasherLocation: Москва PostPosted: Tue Jun 17, 2014 20:46
    —
Skif_off wrote:
Если скрипт запущен из ТС, то все %COMMANDER_*% будут наследованы от родительского процесса
#SingleInstance, force - только для повторных запусков, а новые процессы разных ТС могут запускаться без них.

#11:  Author: Skif_off PostPosted: Tue Jun 17, 2014 23:42
    —
Flasher
Заменить на off, а скрипт запускать с передачей %AUTORUN_TCPID% параметром запуска?
Тогда каждую версию скрипта можно привязать к своему PID.

#12:  Author: LonerDLocation: Донецк PostPosted: Wed Jun 18, 2014 00:28
    —
Flasher wrote:
Это смотрел?

Судя по теме на скрипт-форуме, всё чересчур сложно...

Flasher wrote:
надо ли заморачиваться с непортабельными версиями - даже не знаю. Кто из их пользователей будет данный скрипт использовать - большой вопрос.

Тоже большой вопрос. Потому пока не спешу заморачиваться. Может, со временем сделаю.

Skif_off wrote:
Flasher
Заменить на off, а скрипт запускать с передачей %AUTORUN_TCPID% параметром запуска?
Тогда каждую версию скрипта можно привязать к своему PID.

Цель не в том, чтобі привязывать скрипт к PIDам, а наоборот - отвязать, чтобы работал с любым окном Тотала.
Мы запускаем Тотал, запускаем из-под него скрипт. Дальше запускаем другой Тотал из другого каталога с другими настройками. Так вот со вторым Тоталом скрипт полноценно не может работать. Там нужно всего-то одну настройку считать из файла конфигурации, но простым путём мы не можем узнать расположение файла конфигурации второго Тотала.

PS. Как вариант - ещё перебор контролов окон. Это не добавит скорости скрипту, но наверное всё-же быстрее будет, чем каждый раз елозить ini-файл.

#13:  Author: FlasherLocation: Москва PostPosted: Wed Jun 18, 2014 10:30
    —
LonerD wrote:
Судя по теме на скрипт-форуме, всё чересчур сложно...
Сложно. Но результат есть, надо с ним пробовать.

#14:  Author: FlasherLocation: Москва PostPosted: Sun Jun 22, 2014 17:07
    —
LonerD
Скинь, пож-та, в спойлер секции, при которых у тебя всё работает.

#15:  Author: LonerDLocation: Донецк PostPosted: Tue Jun 24, 2014 04:49
    —
У меня работает с простейшим вариантом:
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? Что-то не срабатывает такой тег.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page 1, 2  Next  :| |:
Page 1 of 2

Powered by phpBB © 2001, 2005 phpBB Group