AHK: Активация файловой панели при наведении мыши

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD писал(а):Так они и есть в начале кода.
Так а ты наличие контролов не отслеживаешь.
LonerD писал(а):Можно. Вот и вот.
Хм. Забирай.
И это касается здешнего скрипта тоже, работу в режиме быстрого просмотра никто не отменял.
LonerD писал(а):через мышиный хук
Вариант пошустрее первого.
LonerD писал(а):невозможно выставить задержку
Почему?
LonerD писал(а):активация окна Акелпада действует на скрипт тлетворно
У меня всё в порядке.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Flasher писал(а):Так а ты наличие контролов не отслеживаешь.
Наличие контролов отслеживать бесполезно, они всегда Enabled. Проверять нужно тот факт, что контрол видимый (контрол TInEdit1/Edit1 становится видимым, когда инициируется процесс переименования файла - можно отследить скриптовой программой Control Viewer).
GetKeyState, LBState, LButton, P ; проверяю, что зажата левая кнопка мыши.
ControlGet, Editmode32, Visible,, TInEdit1, A ; проверяю, что видимый контрол переименования файла в 32-х битном Тотале
ControlGet, Editmode64, Visible,, Edit1, A ; то же самое в 64-х битном
if ( LBState != D ) and ( Editmode32 = 0 ) and ( Editmode64 = 0 ) ; Если левая кнопка мыши не зажата И если не видимы контролы переименования - тогда выполняется остальной скрипт.
Flasher писал(а):
LonerD писал(а):Можно. Вот и вот.
Хм. Забирай.
И это касается здешнего скрипта тоже, работу в режиме быстрого просмотра никто не отменял.
Хм... Буду думать дальше.
Flasher писал(а):
LonerD писал(а):невозможно выставить задержку
Почему?
Потому, что не знаю как именно и где именно выставлять. Во втором варианте скрипта движение мыши отслеживается постоянно. Если в функцию LowLevelMouseProc вставить паузу Sleep - мыша начинает вести себя непредсказуемо; при маленькой паузе движения похожи на слоу-мо, при высокой паузе - почему-то первый рывок сложный, а дальше работает как будто паузы и нет...
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD писал(а):Проверять нужно тот факт, что контрол видимый
Согласен. Помню, что с ControlGet связано.
LonerD писал(а):Если левая кнопка мыши не зажата И если не видимы контролы переименования - тогда выполняется остальной скрипт.
Да, я на новый код уже смотрел.
LonerD писал(а):а дальше работает как будто паузы и нет
Мм. Там что-то на лупах завязано. Надо помозговать.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

;================================================================
Ап. И ещё один вариант - микс из таймера (значение можно регулировать) и хука движения мыши. У меня вроде не "залипает" после активации других окон. Пока не работает проверка на зажатую левую кнопку (при копировании/перемещении). С панелями быстрого просмотра ещё тоже не разбирался, наверняка долгая история с ними будет.

Код: Выделить всё

;================================================================
 ; Сделать файловую панель активной при наведении на неё курсора мыши
 ; Альтернативный вариант
 ; Версия скрипта: 1.05a
 ; Дата создания: 2014.06.15
 ; Автор скрипта: LonerD
 ; Фрагменты кода: OnMyDSeeAtAll, serzh82saratov
 ; Сайт: http://dreamlair.net
 ;================================================================

#NoEnv
#NoTrayIcon
#Persistent
#KeyHistory, 0
#SingleInstance, force
ListLines, Off

hHookMouse := DllCall("SetWindowsHookEx" . (A_IsUnicode ? "W" : "A")
   , Int, WH_MOUSE_LL := 14
   , Int, RegisterCallback("LowLevelMouseProc", "Fast")
   , Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
   , UInt, 0, Ptr)
 Return

LowLevelMouseProc(nCode, wParam, lParam)
{
   Critical
   SetTimer, mTimer, -50
   Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)
}

mTimer:
If WinActive("ahk_class TTOTAL_CMD")
{
    KeyWait, LButton
    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
      }
  }
}
W_TreeList2
Последний раз редактировалось LonerD Пн июн 16, 2014 04:30, всего редактировалось 1 раз.
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD писал(а):Пока не работает проверка на зажатую левую кнопку (при копировании/перемещении).
If WinActive("ahk_class TTOTAL_CMD")
{
  • KeyWait, LButton
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Flasher
Спасибо. Гениально и просто. Зациклился на While not GetKeyState("LButton") / GetKeyState , а до такого не додумался.
Windows 11 | TC DreamLair eternal pre-α
Ответить