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 16, 2014 05:20    Post subject: AHK: Прокрутка вкладок панелей колёсиком (тачем) мыши Reply with quote

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.
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α


Last edited by LonerD on Mon Jun 16, 2014 22:47; edited 1 time in total
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Mon Jun 16, 2014 13:54    Post subject: Reply with quote

AutoHotkey_L Unicode 32-bit 1.1.08.01. Win XP/7 x32. Прокрутки нет.
_________________
Автору сборки 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: Mon Jun 16, 2014 16:21    Post subject: Reply with quote

Жаль.
Скинь свои настройки wincmd.ini., может названия классов контролов другие при таких настройках.
_________________
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: Mon Jun 16, 2014 17:23    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: Mon Jun 16, 2014 19:22    Post subject: Reply with quote

Flasher
Ага, понял. В конфиг-файле чистого Тотала нет секции [Layout]. Галочки в настройках стоят, но записей в ini-файле нет, секция появится только после того, как поставить/снять вручную галочки в настройках Smile
Поправил.

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

Как определить местоположение файла конфигурации для активного окна Тотала - вопрос на засыпку. Нашёл только какие-то прямые решения на С, в общем не осилю. Значит, буду решать вопрос по старинке...
_________________
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: Tue Jun 17, 2014 00:07    Post subject: Reply with quote

LonerD
В общем, у меня как не работало, так и не работает.

LonerD wrote:
Как определить местоположение файла конфигурации для активного окна Тотала - вопрос на засыпку.
Любая копия имеет заголовок с присвоенным номером. Считываешь PID процесса и смотришь в нём переменную COMMANDER_INI.
Либо можно считывать путь из комстроки.
_________________
Автору сборки 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: Tue Jun 17, 2014 02:39    Post subject: Reply with quote

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%
Вроде такой порядок?
_________________
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: Tue Jun 17, 2014 06:47    Post subject: Reply with quote

LonerD wrote:
Как по PID узнать внутреннюю переменную окружения?
Это смотрел?

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

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



Joined: 28 Nov 2012
Posts: 1232

Post (Separately) Posted: Tue Jun 17, 2014 19:41    Post subject: Reply with quote

LonerD wrote:

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

А зачем? Если скрипт запущен из ТС, то все %COMMANDER_*% будут наследованы от родительского процесса (а я не вижу иного способа, как запускать скрипт плагином AutoRun).
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Tue Jun 17, 2014 20:46    Post subject: Reply with quote

Skif_off wrote:
Если скрипт запущен из ТС, то все %COMMANDER_*% будут наследованы от родительского процесса
#SingleInstance, force - только для повторных запусков, а новые процессы разных ТС могут запускаться без них.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1232

Post (Separately) Posted: Tue Jun 17, 2014 23:42    Post subject: Reply with quote

Flasher
Заменить на off, а скрипт запускать с передачей %AUTORUN_TCPID% параметром запуска?
Тогда каждую версию скрипта можно привязать к своему PID.
Back to top
View user's profile Send private message
LonerD



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

Post (Separately) Posted: Wed Jun 18, 2014 00:28    Post subject: Reply with quote

Flasher wrote:
Это смотрел?

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

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

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

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

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

PS. Как вариант - ещё перебор контролов окон. Это не добавит скорости скрипту, но наверное всё-же быстрее будет, чем каждый раз елозить ini-файл.
_________________
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: Wed Jun 18, 2014 10:30    Post subject: Reply with quote

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



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

Post (Separately) Posted: Sun Jun 22, 2014 17:07    Post subject: Reply with quote

LonerD
Скинь, пож-та, в спойлер секции, при которых у тебя всё работает.
_________________
Автору сборки 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: Tue Jun 24, 2014 04:49    Post subject: Reply with quote

У меня работает с простейшим вариантом:
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? Что-то не срабатывает такой тег.
_________________
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