Autorun

Обсуждение только плагинов и утилит для Total Commander.

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

Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Равномерное изменение тональности фона
Пульсар коммандера
Может у меня что-то с расцветкой не то, но меняет только один раз, первый вариант на чёрный, второй на белый :)
yahuu писал(а):Как WinFind найти "окно" #32768? Или меню?
Всё сделано правильно, только перед поиском нужна задержка, меню не успевает появиться.
yahuu писал(а):Как получить координаты курсора?
MouseGetPos.

Всё вместе как-то так:

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

Func DisplayProcessBar
   CommandExec em_ProcessBar
   Sleep(50) 
   MouseGetPos("", "y")
   WinSetPos("", y,"","","", WinFind(0, "#32768"))
EndFunc
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Может у меня что-то с расцветкой не то, но меняет только один раз, первый вариант на чёрный, второй на белый :)
Ну вот, получил незачет :lol:

Проверял только на сером и на его [s]пятидесяти[/s] оттенках - вроде работает.) Цветной фон тоже меняет, но дойдя до границы, сбрасывает в белый, а затем, соответственно, в серые тона.

А вообще, по большому счету, это был прикол :) Хотя потребность в инкрементальном увеличении или уменьшении тональности на лету давненько назревала. Иногда возникает ощущение чуть пригасить или добавить яркости тону панели.
Аватара пользователя
Monarch-LFV
Сообщения: 360
Зарегистрирован: Пн июл 22, 2019 13:20

Сообщение Monarch-LFV »

Orion9 писал(а):Иногда возникает ощущение чуть пригасить или добавить яркости тону панели.
А не лучше уменьшать яркость всего монитора, а не только панелей ТС? В других то приложениях она остается бить по глазам.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Monarch-LFV
Можно и монитора. Но я, наверно, не совсем точно выразился. Речь скорее не о яркости, а о светлости. И только фона панелей, а не всего экрана. Например, когда ищешь новый универсальный цвет, чтобы можно было его тонко подстраивать на лету, сразу видя все изменения на панелях в реальном времени, а не после закрытия диалоговых окон и кликов на окнопки "OK" или "Применить".

Сейчас поэксперементировал с новый фишкой на это счет - при помощи ColorMania быстро примеривать фон на панелях.
https://www.blacksunsoftware.com/colormania.html

Это очень очень грубый код, но он работает.

[cut]

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

SetHotkeyAction /K:C /V:187 FindWindow 1
SetHotkeyAction /K:C /V:189 FindWindow 0

Global WinWatch = 0

Func FindWindow(nParam)
Local h = 0, max = 1*255 + 256*255 + 65536*255, upd = 1, clip

   # отслеживание уже запущено
   if nParam = 1 and WinWatch = 1 then Return		
   
   WinWatch = nParam
  
   While WinWatch = 1
       clip = StrPart(ClipGet(), auLF, 1)
          
          if IsInt(clip) then
             if clip > 0 and clip <= max then
             
                #WinSetText(clip)
                
                IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %clip%
                IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %clip%
   
                If upd = 1 Then
                   SendCommand 2957      
                   SendCommand 2957
                EndIf      

             endif
          endif

       Sleep(250)
       if WinWatch = 0 then Return
     
   Wend
EndFunc
[/cut]
Скрипт отслеживает буфер обмена, и если в нем находится целое значение попадающее в диапазон цветов фона, он его применяет. В ColorMania нужно выбрать формат Powerbuilder, который подходит для ТС, затем выбрать нужный цвет и нажать "Copy". Скрипт перехватить в буфере число и применит его. Повторю, что это очень грубый и сырой код, который еще нужно дорабатывать и дорабатывать, доделав к нем кучу проверок и защиту от лишней и некорректой записи, а также надлежащий старт/стоп и статус.

Хотел попутно спросить у разработчика. А как получить значение с контрола в ColorMania, где хранится значени цвета? Хэндлы все получаются как надо, а вот текст не вытягивается:

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

   h = WinFind(0, "TfrmColorPick")
   if h > 0 then
      c = WinFind(h, "TEdit", 1)
      MsgBox(WinGetText(c))
   endif
yahuu
Сообщения: 40
Зарегистрирован: Чт июн 22, 2023 07:32

Сообщение yahuu »

Loopback писал(а):
yahuu писал(а):Как получить координаты курсора?
MouseGetPos.
Я хочу получить не координаты курсора мыши, а координаты объекта, на котором в данный момент установлен фокус в списке файлов. Я хочу переместить меню поближе к нему.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Хэндлы все получаются как надо, а вот текст не вытягивается
Да, это проблема в WinGetText, использованный там GetWindowText не может получать текст контролов другого приложения. Исправлю.
yahuu писал(а):Я хочу получить не координаты курсора мыши, а координаты объекта, на котором в данный момент установлен фокус в списке файлов.
Понятно. В данный момент такого нет, но запланировано.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Да, это проблема в WinGetText, использованный там GetWindowText не может получать текст контролов другого приложения. Исправлю.
Было бы хорошо: можно было бы сразу считывать и применять значения.

Но и сейчас с кнопкой "Copy" неплохо работает. Довел до более-менее пригодного состояния в отдельном модуле:

[cut="Backdrop.aucfg"]

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

# Ctrl+Shift+"+" 	- Добавить яркость
# Ctrl+Shift+"-" 	- Убавить яркость
# Ctrl+"+" 		- Запуск пульсирования
# Ctrl+"-" 		- Остановка пульсирования

Global Pulsar = 0, BACKDROP_THREAD = 0, Previous1 = 0, Previous2 = 0

SetHotkeyAction /K:C /K:S /V:187 SetBackGround 1
SetHotkeyAction /K:C /K:S /V:189 SetBackGround 2

SetHotkeyAction /K:C /V:187 SetPulsar 1
SetHotkeyAction /K:C /V:189 SetPulsar 0

RegisterCommand 70001 "AutoBackdrop"

if Previous1 = 0 or Previous2 = 0 then
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
endif
  
Func AutoBackdrop(lParam)

   If IsPressed (0x10) And IsPressed (0x11) Then Return SetBackGround(1)	# Ctrl+Shift+Click() 	- Добавить яркость
   If IsPressed (0x11) Then Return SetBackGround(2)				# Ctrl+Click() 		- Убавить яркость
   If IsPressed (0x12) Then 							# Altt+Click() 		- Вернуть предыдущий фон
      if Previous1 > 0 or Previous2 > 0 then
         IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %Previous1%
         IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %Previous2%
         SendCommand 2957
         SendCommand 2957
      endif
      Return 
   endif 

   if BACKDROP_THREAD > 0 then		# поток уже запущен
      BACKDROP_THREAD = 0
   else
      BACKDROP_THREAD = 1
      RunThread ThreadBackdrop
      MsgBox("Отслеживание буфера запущено." & auLF & auLF & "Значения в буфере будут применятся к фону панелей.")
   endif   
   		
EndFunc

Func ThreadBackdrop()
Local h = 0, max = 1*255 + 256*255 + 65536*255, clip, last = 0 

   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1		# старые значения перед циклом
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1

   While BACKDROP_THREAD = 1
   
       clip = StrPart(ClipGet(), auLF, 1)			# первая строка в буфере 
          
       if IsInt(clip) then
          if clip > 0 and clip <= max and not (clip = last) then	# число в диапазоне
          
             WinSetText("Applying background value: " & clip)
             
             IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %clip%
             IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %clip%

             SendCommand 2957
             SendCommand 2957
             
             last = clip
             Sleep(300)

          endif
       endif
       
       Sleep(250)
       WinSetText("BACKDROP_THREAD is running...")
       
   Wend
   BACKDROP_THREAD = 0
   MsgBox("Отслеживание буфера завершено")
EndFunc

Func SetBackGround(nParam)
Local bkg1, bkg2, max = 1*255 + 256*255 + 65536*255

   if Pulsar = 1 then max = 1*235 + 256*235 + 65536*235		# при пульсировании потолок чуть меньше
       
   IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
   
   if bkg1 = -1 then bkg1 = max
   if bkg2 = -1 then bkg2 = max
   
   if nParam = 1 then
      bkg1 = bkg1 + 1 + 256 + 65536
      bkg2 = bkg2 + 1 + 256 + 65536      
   else
      bkg1 = bkg1 - 1 - 256 - 65536
      bkg2 = bkg2 - 1 - 256 - 65536      
   endif
   
   if bkg1 > max then bkg1 = bkg1 - 1 - 256 - 65536
   if bkg2 > max then bkg2 = bkg2 - 1 - 256 - 65536
   
   if bkg1 < -1 then bkg1 = max 
   if bkg2 < -1 then bkg2 = max    
   
   IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %bkg1%
   IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %bkg2%
   
   SendCommand 2957
   SendCommand 2957
EndFunc

Func SetPulsar(nParam)

   if nParam = 1 and Pulsar = 1 then Return 		# цикл уже запущен
   
   Pulsar = nParam
  
   While Pulsar = 1
   
      For j = 1 To 2      
         For i = 1 To 75
             SetBackGround(j)
             Sleep(25)
             if Pulsar = 0 then Return
         Next
      Next
      
   Wend
   
EndFunc 
[/cut]
[cut="Кнопка"]

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

TOTALCMD#BAR#DATA
70001

%COMMANDER_PATH%\Utilites\ColorMania\ColorMania.exe
Включить/Выключить|Отслеживание в буфере цвета фона|Ctrl - Добавить яркость|Ctrl+Shift - Убавить яркость|Alt - Вернуть предыдущий


70001
[/cut]
Все как и раньше, но теперь есть управление через кнопку + статус в заголовке (но тут придется самостоятельно возвращать предыдущее значение заголовка отдельной парой строк, если это требуется). Скрипт после запуска следит за буфером и ждет численного значения, которое применяется в качестве фона. Удобно использовать со сторонними утилитами, например с ColorMania. Можно отдельно повышать или уменьшать тон фона комбинациями клавиш или нажатием на кнопку с клавишами-модификаторами. Пульсар оказался, кстати, не таким уж и бесполезным, наоборот - наглядно демонстрирует градацию тонов. Но работает не так совершенно и может уходить в "серую зону" :)

Потестировать как следут времени не было, т.ч. могут быть косяки. Но вот поиграться с выбором цвета фона, как в былые времена, желания прибавилось :lol:

P.S.

Тут еще возникла необходимость автоматического закрытия хинта через переод времени. Поммню, мы делали задержку Delay, может сделать параметр, который будет скрывать подсказку автоматически?
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Еще один вопрос. А можно как-то изменить текст в строке состояния?

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

h = WinFind(AUTORUN_TCHANDLE, "TMyPanel", 5)
MsgBox(WinGetText(h))
Текст прочитан.

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

WinSetText("Test Text", h)
WinRedraw
Если верить Autoit Windows Info, текст устанавливается, но изменения в ТС не отображаются.

QuickSearch eXtended во время работы создает симпатичную иконку в строке состояния, которая используются в качестве индикатора активности. Можно как-то придумать, чтобы Autorun тоже загружал иконку или маленькую bmp-шку куда угодно (хоть в заголовок) для индикации внутренних процессов?

Добавлено спустя 2 часа 41 минуту:

Что-то я забыл про такие классные ключики, как /R /DM для команды SetHotkeyAction. С ними вообще ништяк работает :) Никакой автоперебор тонов теперь не нужен, но оставил ради прикола. Теперь Ctrl+"+" запускает градации вверх, а Ctrl+"-" - вниз. Остановить можно повторным нажатием, либо ESC. Добавил счетчик записи в ini-файл и возможность посмотреть текущие значения с клавишей Win. И всякие прочие мелкие доработки. В общем, теперь уже лучше

[cut="Backdrop.aucfg"]

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

# Ctrl+Shift+"+" 	- Добавить яркость
# Ctrl+Shift+"-" 	- Убавить яркость
# Ctrl+"+" 		- Авто повышение тонов вверх
# Ctrl+"-" 		- Авто повышение тонов ввиз
# ESC 			- Отмена

Global Pulsar = 0, BACKDROP_THREAD = 0, Previous1 = 0, Previous2 = 0

SetHotkeyAction /K:C /K:S /V:187 /R /DM SetBackGround 1
SetHotkeyAction /K:C /K:S /V:189 /R /DM SetBackGround 2

SetHotkeyAction /K:C /V:187 SetPulsar 1
SetHotkeyAction /K:C /V:189 SetPulsar 2

RegisterCommand 70001 "AutoBackdrop"

if Previous1 = 0 or Previous2 = 0 then
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
endif
  
Func AutoBackdrop(lParam)

   If IsPressed (0x10) And IsPressed (0x11) Then Return SetBackGround(1)	# Ctrl+Shift+Click() 	- Добавить яркость
   If IsPressed (0x11) Then Return SetBackGround(2)				# Ctrl+Click() 		- Убавить яркость
   If IsPressed (0x12) Then 							# Alt+Click() 		- Вернуть предыдущий фон
      if Previous1 > 0 or Previous2 > 0 then
         IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %Previous1%
         IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %Previous2%
         SendCommand 2957
         SendCommand 2957
      endif
      Return 
   endif
   If IsPressed (0x5B) Then Return ShowBackColor()				# Win+Click() 		- Показ значений

   if BACKDROP_THREAD > 0 then							# поток уже запущен
      BACKDROP_THREAD = 0
   else
      BACKDROP_THREAD = 1
      RunThread ThreadBackdrop
      MsgBox("Отслеживание буфера запущено." & auLF & auLF & "Значения в буфере будут применятся к фону панелей.")
   endif   
   		
EndFunc

Func ThreadBackdrop()
Local h = 0, max = 1*255 + 256*255 + 65536*255, clip, last = 0, w = 0 

   # старые значения перед циклом
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1

   While BACKDROP_THREAD = 1
       # первая строка в буфере 
       clip = StrPart(ClipGet(), auLF, 1)			
          
       if IsInt(clip) then
          # новое число в диапазоне
          if clip > 0 and clip <= max and not (clip = last) then
          
             WinSetText("Applying background value: " & clip)
             
             IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %clip%
             IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %clip%

             SendCommand 2957
             SendCommand 2957
             
             w = w + 1
             last = clip
             Sleep(300)

          endif
       endif
       
       Sleep(250)
       WinSetText("BACKDROP_THREAD is running...")
       
   Wend
   BACKDROP_THREAD = 0
   WinSetText("")
   MsgBox("Отслеживание буфера завершено" & auLF & auLF & "Применений фона: " & w)
EndFunc

Func SetBackGround(nParam)
Local bkg1, bkg2, max = 1*255 + 256*255 + 65536*255

   # при пульсировании потолок чуть меньше
   if Pulsar = 1 then max = 1*245 + 256*245 + 65536*245
       
   IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
   
   if bkg1 = -1 then bkg1 = max
   if bkg2 = -1 then bkg2 = max
   
   if nParam = 1 then
      bkg1 = bkg1 + 1 + 256 + 65536
      bkg2 = bkg2 + 1 + 256 + 65536      
   else
      bkg1 = bkg1 - 1 - 256 - 65536
      bkg2 = bkg2 - 1 - 256 - 65536      
   endif
   
   if bkg1 > max then bkg1 = bkg1 - 1 - 256 - 65536
   if bkg2 > max then bkg2 = bkg2 - 1 - 256 - 65536
   
   if bkg1 < -1 then bkg1 = max 
   if bkg2 < -1 then bkg2 = max    
   
   IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %bkg1%
   IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %bkg2%
   
   SendCommand 2957
   SendCommand 2957
EndFunc

Func SetPulsar(nParam)
local a, b, s
   
   if Pulsar = 1 then 
      Pulsar = 0
      Return
   endif
   
    Pulsar = 1
   
   if nParam = 1 then 
      a = 1
      b = 2
      s = 1
   else
      a = 2
      b = 1
      s = -1
   endif
  
   While Pulsar = 1
   
      For j = a To b step s
      
         For i = 1 To 75
         
             SetBackGround(j)
             Sleep(25)
             
             if Pulsar = 0 then Return
             
             If IsPressed (0x1B) Then
                Pulsar = 0
                Return
             endif
             
         Next
         
      Next
      
   Wend
EndFunc 

Func ShowBackColor()
Local txt, bkg1, bkg2, max = 1*255 + 256*255 + 65536*255
       
   IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
   
   if bkg1 = -1 then bkg1 = max
   if bkg2 = -1 then bkg2 = max

   blue = floor(bkg1/65536)
   green = bkg1 - (blue * 65536)
   green = floor(green/256)
   red = bkg1 - (blue * 65536) - (green * 256)
   
   txt = "Фон 1" & auLF & "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue & auLF & "Значение: " & bkg1
   txt = txt & auLF & "--------------" & auLF
   
   blue = floor(bkg2/65536)
   green = bkg2 - (blue * 65536)
   green = floor(green/256)
   red = bkg2 - (blue * 65536) - (green * 256)
   
   txt = txt & "Фон 2" & auLF & "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue & auLF & "Значение: " & bkg2
   ShowHint(txt)
EndFunc
[/cut]
[cut="Кнопка"]

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

TOTALCMD#BAR#DATA
70001

%COMMANDER_PATH%\Utilites\ColorMania\ColorMania.exe
Включить/Выключить|Отслеживание в буфере цвета фона|Ctrl - Убавить яркость|Ctrl+Shift - Добавить яркость|Alt - Вернуть предыдущий|Win - Показать значения


70001
[/cut]
P.S.

Все. Наигрался я с цветами :mrgreen:
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Orion9 писал(а):QuickSearch eXtended во время работы создает симпатичную иконку в строке состояния, которая используются в качестве индикатора активности.
Вы уверены? Пользуюсь постоянно много лет, но ничего подобного не наблюдаю.
Последний раз редактировалось Avada Пн ноя 11, 2024 15:32, всего редактировалось 1 раз.
Даже самая богатая фантазия
Не представит себе наши безобразия.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Может, имеется ввиду встроенный быстрый поиск?
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

sa
У встроенного быстрого поиска тем более ничего там быть не должно.
Даже самая богатая фантазия
Не представит себе наши безобразия.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Перепутал с быстрым фильтром:
Фильтрация остаётся активной и после закрытия диалога; это будет отмечено специальным значком в строке состояния файловой панели.
Аватара пользователя
Monarch-LFV
Сообщения: 360
Зарегистрирован: Пн июл 22, 2019 13:20

Сообщение Monarch-LFV »

Avada
QuickSearch eXtended действительно создает иконку фильтра в правом углу строки состояния, которая говорит, что включен фильтр (должна быть зажата Ctrl+S на самом фильтре). Первое нажатие на Esc убирает поле ввода фильтра, но значок внизу остается, второе нажатие Esc сбрасывает фильтр и значок исчезает. Удобно!
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Monarch-LFV
Теперь понял, о чём речь. Да, быстрый фильтр. И это, разумеется, в самом деле собственная функция TC, а не упомянутой утилиты.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а): Поммню, мы делали задержку Delay, может сделать параметр, который будет скрывать подсказку автоматически?
В этом нет необходимости. ShowHint не блокирует скрипт, поэтому можно организовать задержку с Sleep, а потом установить фокус на окно тотала WinSetState(23), хинт при этом закроется.
Orion9 писал(а):А можно как-то изменить текст в строке состояния?
Если верить Autoit Windows Info, текст устанавливается, но изменения в ТС не отображаются.
Значит панель c собственной отрисовкой, данные тотал берет откуда-то из другого места и они могут не совпадать с текстом контрола. Так что видимо нет, нельзя.
Orion9 писал(а):Можно как-то придумать, чтобы Autorun тоже загружал иконку или маленькую bmp-шку куда угодно (хоть в заголовок) для индикации внутренних процессов?
Вряд ли. До времени подобных свистелок ещё далеко.
Ответить