Страница 157 из 243

Добавлено: Ср дек 04, 2024 11:04
Loopback
Orion9 писал(а):Да вроде сработала у меня примерка
Без обрамляющих скобок давало неправильный результат.
Orion9 писал(а):В чем причина лишних строк?
Занятный баг, проблема в том, что во внутренней функции форматирования \r возвращала LF, а \n - CR, а должно быть наоборот. Поэтому в выводе оказывался неправильный перевод вида LFCR, который, к примеру, MsgBox съедает нормально, а при вставке из буфера возникает двойной перевод строки.

Баг некритичный, не хотелось бы под него выпускать версию. Если вдруг будет ещё что-то критическое - то войдёт в хотфикс, если нет, то в плановом порядке.

Пока можно обойти так:

ClipPut(StrReplace(GetState("libs"), auLF & auCR, auCRLF))
Orion9 писал(а): но в справке действительно нет, как нет и про новые операторы.
Есть и то, и другое. Составные операторы в разделе "переменные". Не самое лучшее место, но и оператор присваивания в Autorun не совсем оператор. Впрочем, потом может еще поменяю.
Orion9 писал(а):там уже столько функций разных - и найти можно, и активировать, и фокус установить - что возникает вопрос: почему бы не послать нажатия )
Оконных функций я бы сказал уже неприлично много. Но они все простые. А отправка клавиш - нет, несмотря на кажущуюся тривиальность.

Добавлено: Ср дек 04, 2024 13:12
Orion9
Loopback
Чуть было не забыл: Так вы можете подтвердить проблему Pragma AutorunPluginFields в 64-ой версии ТС? Решить как-то можно?
Похоже, проблема была как раз в предыдущей версии и ProcessExecGetOutput обрезала лишнее.
Да, не посмотрел на проблему с этого ракурса. Но теперь смутно вспоминаю, что вроде даже подстраивался под такое поведение, по крайней мере обращал на это внимание.
На самом деле не вижу в этом проблемы, просто используйте StrTrim.
Так и сделал. А в самом ahk-скрипте через RTrim убрал лишний символ LF.
ClipPut(StrReplace(GetState("libs"), auLF & auCR, auCRLF))
Сделал. Результатом доволен :)
Есть и то, и другое. Составные операторы в разделе "переменные". Не самое лучшее место, но и оператор присваивания в Autorun не совсем оператор. Впрочем, потом может еще поменяю.
Времени просто не было внимательно все изучить. Но думаю, такое можно и в разделе "Выражения" продублировать (или сделать дополнительную ссылку на раздел "Переменные" до кучи).
Оконных функций я бы сказал уже неприлично много. Но они все простые. А отправка клавиш - нет, несмотря на кажущуюся тривиальность.
Жаль, что есть сложности... Фича бы очень пригодилась. Например, благодаря вашим фиксам в новой бете, текст в окне ColorMania теперь успешно устанавливается:

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

h = WinFind(0, "TfrmColorPick")
If h > 0 Then
    #синхронизация текста 
    WinSetText(ColorText, WinFind(h, "TEdit", 1))         
Endif
Но само по себе это ничего не дает, потому что для установки значения цвета из этого поля, нужно еще нажать на кнопку "Set" или нажать Enter. Большинство полей редактирования будут работать по тому же принципу. Я, кстати, попробовал ради интереса послать сообщения кнопке:

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

b = WinFind(h, "TButton", 2)
SendMessage(b, 513)
Sleep(100)
SendMessage(b, 514)
Вроде работает, но только при условии, что указатель мыши не оказывается в окне Colormania после клика. Но главное - работает, даже если окно свернуто в трей, а значит можно и клавиши послать через WM_KEYDOWN и WM_KEYUP, правильно я понимаю?

Мелочь: А нельзя ли развить тему для ItemAtCursor и сделать вспомогательную функцию по типу RequestCopyDataInfo, которая будет сразу возвращать имя и путь объекта под курсором, если он, конечно, там есть?

Добавлено: Ср дек 04, 2024 18:35
Loopback
Orion9 писал(а):Так вы можете подтвердить проблему Pragma AutorunPluginFields в 64-ой версии ТС?
Нет, не могу подтвердить. Проверил, код согласно вот этому замечанию
Orion9 писал(а):А вот из ТС х64 нет захода даже в функцию BigHint (окно дебаггера остается чистым, если добавить к телу функции OutputDebugString(GetState("vars",2)))

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

Func BigHint(FileName, FieldIndex, UnitIndex)
    OutputDebugString(GetState("vars",2))
EndFunc
в x64 успешно выводит все три переменные. По 60 раз. Так что это не похоже на проблему с входом в функцию на x64.
Orion9 писал(а):нужно еще нажать на кнопку "Set" или нажать Enter
Надёжнее кнопке послать BM_CLICK :

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

b = WinFind(h, "TButton", 2)
SendMessage(b, 0xF5, 0, 0)
Orion9 писал(а):А нельзя ли развить тему для ItemAtCursor и сделать вспомогательную функцию по типу RequestCopyDataInfo, которая будет сразу возвращать имя и путь объекта под курсором, если он, конечно, там есть?
Пока не знаю.

Добавлено: Чт дек 05, 2024 00:21
Orion9
Loopback писал(а):

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

Func BigHint(FileName, FieldIndex, UnitIndex)
    OutputDebugString(GetState("vars",2))
EndFunc
в x64 успешно выводит все три переменные. По 60 раз. Так что это не похоже на проблему с входом в функцию на x64.
А если вот так:

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

Func BigHint(FileName, FieldIndex, UnitIndex)
   If IsPressed (0x11) Then OutputDebugString(GetState("vars",2))
EndFunc
Проблема, похоже, не с функцией BigHint, а с IsPressed. В 32-х битном ТС все нормально.
Loopback писал(а):Надёжнее кнопке послать BM_CLICK :
Спасибо, работает! Надеялся на ваш совет :) Самостоятельно вникать так глубоко не приходится, хотя это все интересно, конечно.)

Пожалуй, пора продемонстрировать плоды нелегкого труда :lol: Вот теперь работает ближе к тому, как оно должно быть на самом деле, хотя это все эксперементально пока. Небольшая оговорка:
Russian.cedf писал(а):Значения ключей, определяющих цвет, могут быть заданы как в десятичном виде (RGB: красный + 256*зелёный + 65536*синий, каждый компонент из диапазона 0..255), так и в шестнадцатеричном (трёхбайтное число $BBGGRR, где RR, GG и BB задают интенсивность красного, зелёного и синего цветов в диапазоне от 00 до FF).
По умолчанию при диалоговом выборе цвета значение записывается в десятичном формате. Чтобы преобразовать с помощью Configuration Editor выбранное значение из десятичного формата в шестнадцатеричный, нужно сохранить цвет в соответствующем системном диалоге кнопкой OK при нажатой клавише SHIFT. Шестнадцатеричный формат будет использоваться для этого значения и при следующих обращениях к тому же диалогу. (Данная методика поддерживается и для прочих цветовых настроек, особенно важна она для стилевой настройки курсорной рамки в ключах InactiveFocus и SelectionFocus.) Столь же простой способ обратного преобразования шестнадцатеричного формата в десятичный не предусмотрен; вы можете удалить текущее значение ключа и задать нужный цвет заново в другом формате либо взять десятичный аналог шестнадцатеричного значения из какой-то сторонней программы, поддерживающей такие преобразования.
Пока нет поддержки шестнадцатеричных значений, ключей темного режима и ключей InactiveFocus и SelectionFocus. Стоит отметить, что менять цвета у курсора и всем, что с ним связано - нет так удобно, поскольку окно ТС теряет фокус и изменения не видны в реальном времени. Но все, что касается остального, очень даже неплохо.

Хотел было записать видео, как предлагал jensoto, но подумал, что нет смысла. Все работает сразу и самым наглядным образом. Поток запускается и ждет окна ColorMania или окна стандартного диалога выбора цвета. Клавиши управления работают только в этих окнах, когда они активны. Ctrl - применить цвет. Shift - откатить. Alt - умолчание (-1), ESC - синхронизировать цвет (только для окна ColorMania). Удерживая Ctrl и водя курсором мыши по палитре цветов - изменения отображаются мгновенно. В принципе, это то, о чем я когда-то мечтал, и чего не хватало. Т.ч. действительно Autorun воплощает мечты! )
[cut="Backdrop.aucfg"]

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

# Ctrl+Shift+"+" 	- 	Повышение тонов
# Ctrl+Shift+"-" 	- 	Понижение тонов
# Ctrl+"+" 		- 	Автоповышение тонов
# Ctrl+"-" 		- 	Автопонижение тонов
# ESC 			- 	Выход из автоперебора
# Alt+"+" 		- 	Показ текущих значений
# Alt+Shift+"+" 	- 	Повышение тона зебра
# Alt+Shift+"-" 	- 	Понижение тона зебра
# Alt+Click (Активная)	-	Переключение фона из Backdrops.bar
# Alt+Click (Целевая)	-	Переключение резервных значений фона

Pragma IncludeOnce

Global Pulsar = 0, PulsarDelay = 50, BACKDROP_THREAD = 0, BackColor1 = 0, BackColor2 = 0, Previous1 = 0, Previous2 = 0

Global CF_NAME = "", CF_VALUE = -1, CF_KEY = 0, CF_COLOR_KEY = 0, WRITE_COLOR_MODE = 0, CL_KEY = "", CL_VALUE = -1, CL_SNAP = ""

Global CL_MousePosX = 0, CL_MousePosY = 0, TEST_HINT = 0

# задержка автоперебора
IniRead /R PulsarDelay %COMMANDER_INI% "Autorun" "PulsarDelay" 50

# панель для запоминания
Global CL_BAR = %COMMANDER_PATH% & "\Bars\Backdrops.bar"
# путь к редактору
Global CL_AKEL4 = %COMMANDER_PATH% & "\Utilites\AkelPad\AkelPad.exe", CL_TCFS2 = ""

# путь к TCFS2 для отправки сообщений
Set /EV- CL_TCFS2 "%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe"

# повышение/понижение тонов
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

# повышение/понижение тона зебра
SetHotkeyAction /K:A /K:S /V:187 /R /DM SetBackGround 1 1
SetHotkeyAction /K:A /K:S /V:189 /R /DM SetBackGround 2 1

# показать текущие значения
SetHotkeyAction /K:A /V:187 ShowBackColor 1000

# 70000-70050

# первоначальные значения цветов
# 0 - запомнить 
# 1 - открыть в редакторе
RegisterCommand 70000 "InitialColors" 1

# регистрация команды для вызова из кнопки (пункта меню)
RegisterCommand 70001 "AutoBackdrop"

# запоминание текущего фона
RegisterCommand 70002 "BackColorBar"

# создание и отображение меню
RegisterCommand 70003 "ShowBackdropMenu"

# ключи секции [Color]
RegisterCommand 70004 "ColorItem" "Backdrop"
RegisterCommand 70005 "ColorItem" "MarkColor"
RegisterCommand 70006 "ColorItem" "CursorColor"
RegisterCommand 70007 "ColorItem" "ForeColor"
RegisterCommand 70008 "ColorItem" "CursorText"
RegisterCommand 70009 "ColorItem" "BackColor"
RegisterCommand 70010 "ColorItem" "BackColor2"

# ключи ColorFilter секции [Color]
RegisterCommand 70011 "ColorFilterItem" 1
RegisterCommand 70012 "ColorFilterItem" 2
RegisterCommand 70013 "ColorFilterItem" 3
RegisterCommand 70014 "ColorFilterItem" 4
RegisterCommand 70015 "ColorFilterItem" 5
RegisterCommand 70016 "ColorFilterItem" 6
RegisterCommand 70017 "ColorFilterItem" 7
RegisterCommand 70018 "ColorFilterItem" 8
RegisterCommand 70019 "ColorFilterItem" 9
RegisterCommand 70020 "ColorFilterItem" 10
RegisterCommand 70021 "ColorFilterItem" 11
RegisterCommand 70022 "ColorFilterItem" 12
RegisterCommand 70023 "ColorFilterItem" 13
RegisterCommand 70024 "ColorFilterItem" 14
RegisterCommand 70025 "ColorFilterItem" 15

# управление потоком
RegisterCommand 70050 "BackdropAction" 0

# прием сообщения окну "установить значения фона"
SetMessageAction /P "BackColorsMessage" SetBackColors

# значения фона при старте ТС
If BackColor1 = 0 or BackColor2 = 0 Then
   IniRead /R BackColor1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R BackColor2 %COMMANDER_INI% "Colors" "BackColor2" -1
Endif

Func BackdropAction(lParam, lAction)
   BACKDROP_THREAD = lAction
EndFunc

Func InitialColors(lParam, lMode)
Local i = 0, cf, txt

   If lMode = 1 Then
      # вызов пункта меню для показа значений
      OpenInTextEditor(CL_SNAP)
      Return 
   Endif
   
   # снимок первоначальных значений 
   CL_SNAP = ";значения секции при запуске ТС" & auCRLF
   CL_SNAP = CL_SNAP & "[Colors]" & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "ForeColor" -1   
   CL_SNAP = CL_SNAP & "ForeColor=" & txt & auCRLF   
   
   IniRead /R txt %COMMANDER_INI% "Colors" "BackColor" -1
   CL_SNAP = CL_SNAP & "BackColor=" & txt & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "BackColor2" -1   
   CL_SNAP = CL_SNAP & "BackColor2=" & txt & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "MarkColor" -1   
   CL_SNAP = CL_SNAP & "MarkColor=" & txt & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "CursorColor" -1   
   CL_SNAP = CL_SNAP & "CursorColor=" & txt & auCRLF
  
   IniRead /R txt %COMMANDER_INI% "Colors" "CursorText" -1   
   CL_SNAP = CL_SNAP & "CursorText=" & txt & auCRLF            

   While i < 100
   
      i = i + 1
   
      IniRead /R cf %COMMANDER_INI% "Colors" %"'ColorFilter' & %i%" "stop"
      If cf="stop" Then Break
      
      IniRead /R txt %COMMANDER_INI% "Colors" %"'ColorFilter' & %i% & 'Color'"
      CL_SNAP = CL_SNAP & cf & "=" & txt & auCRLF            
               
   Wend
   
EndFunc
  
Func AutoBackdrop(lParam)
Static StartCount = 0

   # удержание Win
   # тестирование фона подсказки
   If BACKDROP_THREAD = 0 And IsPressed (0x5B) Then TEST_HINT = 1

   # удержание Ctrl+Shift
   # повышение тона на одну единицу после нажатия
   # на кнопку, выбора пункта меню или вызова другим способом
   If IsPressed (0x10) And IsPressed (0x11) Then Return SetBackGround(1)
   
   # удержание Ctrl
   # понижние тона на одну единицу
   If IsPressed (0x11) Then Return SetBackGround(2)
   
   # удержание Alt+Win
   # вернуть предыдущий фон
   If IsPressed (0x12) And IsPressed (0x5B) Then
      If Previous1 > 0 or Previous2 > 0 Then WriteBackground(Previous1, Previous2)
      Return 
   Endif
   
   # удержание Alt+Shift
   # скопировать в буфер код кнопки текущего фона  
   If IsPressed (0x12) And IsPressed (0x10) Then
      IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
      IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
      ClipPut("TOTALCMD#BAR#DATA" & auCRLF & CL_TCFS2 & auCRLF & _
              "/u- /ef ""msg(regmsg(BackColorsMessage), " & bkg1 & ", " & bkg2 & ")""" & auCRLF & "%COMMANDER_EXE%")
      ShowBackHint("Кнопка с фоном скопирована")
      Return
   Endif
   
   # удержание Alt
   # вернуть первоначальный фон TC
   If IsPressed (0x12) Then Return WriteBackground(BackColor1, BackColor2)
   
   # удержание Shift
   # показ текущих значений фона
   If IsPressed (0x10) Then Return ShowBackColor()   
   
   # поток уже запущен
   If BACKDROP_THREAD > 0 Then
      If TEST_HINT = 1 Then
         ShowHint("Режим TEST_HINT выключен")
         TEST_HINT = 0
         Sleep(700)         
         BACKDROP_THREAD = 0
         Return
      Endif
      ShowPopupMenu /D /F "CreateBackdropMenu"
   Else
      tc = ProcessCount("TOTALCMD.EXE") + ProcessCount("TOTALCMD64.EXE")
      If tc > 1 Then
         ShowHint("Запущено " & tc & " процесса Total Commander" & auLF & _
                  "Для корректной работы требуется только одна копия TOTALCMD")
         Return
      EndIf
      If StartCount = 0 Then InitialColors(0, 0)
      BACKDROP_THREAD = 1
      If TEST_HINT Then 
         CF_NAME = "HINT TEST MODE" 
      Else
         # при старте парное значение фона по умолчанию
         ColorItem(1, "Backdrop")      
      Endif        
      RunThread ThreadBackdrop
      StartCount = StartCount + 1
      SetHintParam("ShowHint", "Font", 10, "Tahoma")
      SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
      SetHintParam("ShowHint", "Text", 0xFFFFFF)
      #SetHintParam("ShowHint", "Frame", 0xFFFFFF)       
      ShowHint("Отслеживание запущено." & auLF & _
               "CTRL - Применение цвета в окне ColorMania" & auLF & auLF & _
               "SHIFT - откат, ALT - умолчание, WIN - из буфера")  
      Sleep(2000)
      #WinSetState(23)
      SetHintParam("ShowHint", "Reload")      
   Endif
   		
EndFunc

# прием сообщения
Func SetBackColors(hWnd, uMsg, wParam, lParam)
     WriteBackground(wParam, lParam) 
EndFunc

# запись парных значений
Func WriteBackground(Color1, Color2)
     IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %Color1%
     IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %Color2%
     # обновление панелей
     SendCommand 2957
     SendCommand 2957
     # OutputDebugString('w ' & Color1)
EndFunc

# запись одиночных значений
Func WriteSingleColor(KeyName, KeyValue)
     IniWrite /R %COMMANDER_INI% "Colors" %"%KeyName%" %KeyValue%
     SendCommand 2957
     SendCommand 2957
     # OutputDebugString('v ' & KeyName)
EndFunc

Func TestHintParam(ParamName, ParamValue, handle)
Local blue, green, red

    blue = floor(ParamValue/65536)
    green = ParamValue - (blue * 65536)
    green = floor(green/256)
    red = ParamValue - (blue * 65536) - (green * 256)
    
    SetHintParam("ShowHint", ParamName, 1*blue + 256*green + 65536*red)
    #SetHintParam("ShowHint", "Text", 0xFFFFFF)
    
    ShowHint("Test text" & auCRLF & "Hex " & Hex(ParamValue, 6) & auCRLF & "Dec " & ParamValue & auLF & _
             "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue)
    Sleep(100)
    SetHintParam("ShowHint", "Reload")
    WinSetState(23, handle)
EndFunc

# функция работает в отдельном потоке
Func ThreadBackdrop()
Local h = 0, r, g, b, c, max = 1*255 + 256*255 + 65536*255, clip, last = -1, w = 0, v = 0, action, state

   # предыдущие значения фона
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
   
   While BACKDROP_THREAD = 1

       # поиск окна Color Dialog Box
       h = WinFind(0, "#32770", "Цвет")
       If h > 0 Then
          action = "Color Dialog Box  > "
          If WinGetState(4, h) Then 
             action = action & "Active  > "
             r = WinGetText(WinFind(h, "Edit", 4))
             g = WinGetText(WinFind(h, "Edit", 5))
             b = WinGetText(WinFind(h, "Edit", 6))
             # непустые поля редактирования
             If Not (StrLen(r) = 0 And StrLen(g) = 0) Then
                c = 1*r + 256*g + 65536*b             
                action = action & "Ready to apply RGB: " & r & ", " & g & ", " & b
             Else
                action = action & "RGB Unreachable"    
             EndIf       
          Endif    
       Else    
          # поиск окна ColorMania
          h = WinFind(0, "TfrmColorPick")       
          If h > 0 Then
             action = "ColorMania  > "
             If WinGetState(4, h) Then 
                action = action & "Active  > "
                c = WinGetText(WinFind(h, "TEdit", 1))
                action = action & "Ready to apply value: " & c
             Endif    
          EndIf        
       EndIf      
                 
       If h > 0 And WinGetState(4, h) > 0 Then
          If IsPressed (0x11) Then       
             # удержание CTRL 
             # значение активного окна
             If StrLen(c) > 0 Then
                clip = c
                action = "Applying " & clip
             Endif            
          ElseIf IsPressed (0x12) Then
             # удержание ALT       
             # значение по умолчанию
             clip = "-1"
             action = "Applying -1"
          ElseIf IsPressed (0x10) Then
             # удержание SHIFT            
             # предыдущее значение
             clip = CL_VALUE
             action = "Undo " & clip             
          ElseIf IsPressed (0x5B) Then
             # удержание WIN              
             # первая строка в буфере 
             clip = StrPart(ClipGet(), auLF, 1)
             action = "Clipboard " & clip           
          ElseIf IsPressed (0x1B) Then
             ColorSync(CL_VALUE)
             action = "Color Sync " & clip      
          Endif
       ElseIf h > 0 And WinGetState(4, h) = 0 Then
          action = action & "Not Active"
       Else       
          action = "Waiting for a window..."
       Endif
          
       If IsInt(clip) Then
          # новое число в диапазоне
          If clip >= -1 And clip <= max And Not (clip = last) Then
              
             If TEST_HINT = 1 Then 
                CF_NAME = "HINT TEST MODE"
                WRITE_COLOR_MODE = 3
             EndIf   
                       
             If WRITE_COLOR_MODE = 0 Then
                WriteBackground(clip, clip)
                w = w + 1
             ElseIf WRITE_COLOR_MODE = 1 Then
                WriteSingleColor(CL_KEY, clip)
                v = v + 1    
             Else
                TestHintParam('BackColor', clip, h)
                v = v + 1                                
             Endif
             last = clip
             Sleep(100)
          Endif
       Endif
       
       Sleep(250)
       WinSetText("Changing colors  > " & CF_NAME & "  > " & action  )
       
   Wend
   BACKDROP_THREAD = 0
   WinSetText("")
   WinRedraw
   
   SetHintParam("ShowHint", "Font", 10, "Tahoma")
   SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
   SetHintParam("ShowHint", "Text", 0xFFFFFF)
   
   ShowHint("Отслеживание остановлено" & auLF & _
            "Применений фона: " & w & auLF & _
            "Применение других значений: " & v)
            
   Sleep(2000)
   WinSetState(23)
   SetHintParam("ShowHint", "Reload")   
EndFunc

Func SetBackGround(nParam, nZebra = 0)
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 Not IsInt(bkg1) Or Not IsInt(bkg2) Then
      MsgBox("Нечисловые значения цвета фона: " & auLF & auLF & _
              "BackColor=" & bkg1 & auLF & "BackColor2=" & bkg2 & auLF & auLF & _
              "ESC - Отмена операции")
      Return
   Endif
   
   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
   
   If nZebra Then
      WriteSingleColor("BackColor2", bkg2)
   Else
      WriteBackground(bkg1, bkg2)
   Endif
   
EndFunc

Func SetPulsar(nParam)
local a, b, s, l
static t = 0
   
   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
   
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
  
   While Pulsar = 1
   
      For j = a To b step s
      
         For i = 1 To 75
             
             SetBackGround(j)
             # значение можно увеличить
             # если мерцает только одна панель
             Sleep(PulsarDelay)
             l = l + 1
             t = t + 1
             
             If Pulsar = 0 Then Break
             
             If IsPressed (0x1B) Then
                Pulsar = 0
                Break
             Endif
             
         Next
         
         If Pulsar = 0 Then Break
      Next
      
   Wend
   # показать статистику, если выход по ESC
   If IsPressed (0x1B) Then
      ShowHint("Изменений тонов: " & l & auCRLF & "Всего изменений: " & t)
   Endif    
EndFunc 

Func ShowBackColor(lDelay = 300)
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

Func BackColorBar(lParam)
Local i, bkg1, bkg2, bar = CL_BAR
       
   If Not FileExist(bar) Then   
      MsgBox("Файл не существует " & bar, "Backdrop")
      Return
   Endif
   
   IniRead i %bar% "Buttonbar" "Buttoncount" 0
   
   If Not IsInt(i) or i < 1 Then
      MsgBox("Ошибка Buttoncount < 1 " & auCRLF & bar, "Backdrop")
      Return
   Endif
   
   IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1   
   
   i = i + 1
  
   IniWrite /EV- %bar% "Buttonbar" %"'Button' & %i%" "%COMMANDER_EXE%"
   IniWrite %bar% "Buttonbar" %"'Cmd' & %i%"    "%CL_TCFS2%"
   IniWrite %bar% "Buttonbar" %"'Param' & %i%"  '"/u- /ef "msg(regmsg(BackColorsMessage), %bkg1%, %bkg2%)"'      
   IniWrite %bar% "Buttonbar" %"'Menu' & %i%"   "Фон %bkg1%, %bkg2%"   
          
   IniWrite %bar% "Buttonbar" "Buttoncount" %i%
   
   ShowBackHint("Фон панелей сохранен")
   
EndFunc

Func ShowBackHint(BackHint, PosX = false)

   SetHintParam("ShowHint", "Font", 10, "Arial")
   SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
   SetHintParam("ShowHint", "Text", 0xFFFFFF)
   
   If PosX Then
      ShowHint(BackHint, CL_MousePosX, CL_MousePosY)   
   Else
      ShowHint(BackHint)
   Endif
   
   Sleep(1000)
   WinSetState(23)
   
   SetHintParam("ShowHint", "Reload")
   
EndFunc

Func CreateBackdropMenu()
Local i = 0, cf, txt

   txt = txt & 'MENUITEM "Остановить отслеживание", 70050' & auCRLF
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF
   txt = txt & 'MENUITEM "Фон\tBackground", 70004' & auCRLF   
   txt = txt & 'MENUITEM "Выделение\tMarkColor", 70005' & auCRLF
   txt = txt & 'MENUITEM "Курсор\tCursorColor", 70006' & auCRLF
   txt = txt & 'MENUITEM "Текст\tForeColor", 70007' & auCRLF
   txt = txt & 'MENUITEM "Текст под курсором\tCursorText", 70008' & auCRLF
   txt = txt & 'MENUITEM "Фон 1\tBackColor", 70009' & auCRLF
   txt = txt & 'MENUITEM "Фон 2\tBackColor2", 70010' & auCRLF
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF   

   While i < 100
   
      i = i + 1
   
      IniRead /R cf %COMMANDER_INI% "Colors" %"'ColorFilter' & %i%" "stop"
      If cf="stop" Then Break
                       
      txt = txt & 'MENUITEM "' & cf & '", 700' & 10+i & auCRLF
      
   Wend
   
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF 
   If BACKDROP_THREAD > 0 Then
      txt = txt & 'MENUITEM "Текущий элемент - ' & CF_NAME & '", 70050'  & auCRLF
   EndIf
   txt = txt & 'MENUITEM "Первоначальные значения секции [Colors]", 70000'
   
   Return txt
EndFunc

Func ShowBackdropMenu(lParam)
    
    # вызов с Shift
    # копировать значение -1 в буфер
    If IsPressed(0x10) Then 
       SetDefaultColor
       Return
    EndIf
    
    # координаты кнопки вызова меню
    MouseGetPos("CL_MousePosX", "CL_MousePosY")
    ShowPopupMenu /D /F "CreateBackdropMenu"
    
EndFunc

Func ColorFilterItem(lParam, wItem)

    Local key1, key2, val1, val2
    
    If BACKDROP_THREAD = 0 Then
       ShowHint("Отслеживание цвета не запущено")
       Return
    Endif

    key1 = "ColorFilter" & wItem
    key2 = key1 & "Color"
    
    IniRead /R val1 %COMMANDER_INI% "Colors" %"%key1%" ""
    IniRead /R val2 %COMMANDER_INI% "Colors" %"%key2%" ""
    
    # формат "ColorFilter1"
    CF_KEY = key1
    # формат "ColorFilter1Color"
    CF_COLOR_KEY = key2
    # формат "Имя фильтра", например "Autorun"    
    CF_NAME = val1
    # формат "Цвет фильтра", например "65535"
    CF_VALUE = val2

    # глобальные значения для потока    
    CL_KEY = CF_COLOR_KEY
    CL_VALUE = CF_VALUE

    # режим записи "Одиночный ключ"      
    WRITE_COLOR_MODE = 1

    ColorItemChange(CL_VALUE)    
    ShowBackHint("Цвет типа выбран" & auCR & "Значения будут применятся к " & CF_NAME, false)
    
EndFunc

Func ColorItem(lParam, sItem)
Local key, val

    If BACKDROP_THREAD = 0 Then
       ShowHint("Отслеживание цвета не запущено")
       Return
    Endif
    
    # парный однотонный фон BackColor = BackColor2
    If sItem = "Backdrop" Then
       # режим записи "Парный ключ"       
       WRITE_COLOR_MODE = 0
       # Имя для потока
       CF_NAME = "Background"
       IniRead /R val %COMMANDER_INI% "Colors" "BackColor" -1
       # значение цвета
       CL_VALUE = val
       ColorItemChange(CL_VALUE)       
       # запуск из меню
       If lParam = 0 Then
          ShowBackHint("Цвет типа выбран" & auCR & "Значения будут применятся к " & CF_NAME)                     
       Endif
       Return      
    Endif
    
    key = sItem
    IniRead /R val %COMMANDER_INI% "Colors" %"%key%" ""

    # глобальные значения для потока        
    CL_KEY = key
    CL_VALUE = val
    CF_NAME = key
    WRITE_COLOR_MODE = 1

    ColorItemChange(CL_VALUE)
    ShowBackHint("Цвет типа выбран" & auCR & "Значения будут применятся к " & CF_NAME, false)
    
EndFunc

# не применять изменения цвета при смене элемента
Func ColorItemChange(ColorText)
    # очистка буфера при смене элемента
    ClipPut(ColorText) 
    # ColorSync(ColorText)
EndFunc

Func ColorSync(ColorText)

    Local h = WinFind(0, "TfrmColorPick")
    If h > 0 Then
        # синхронизация цвета с окном ColorMania 
        WinSetText(ColorText, WinFind(h, "TEdit", 1))
        b = WinFind(h, "TButton", 2)
        SendMessage(b, 0xF5, 0, 0)
    Endif
    
EndFunc

Func OpenInTextEditor(Text)
Local h = 0

    ClipPut(Text)
    
    h = WinFind(0, "AkelPad4")
    If h > 0 Then
       ShellExec /SW_SHOWNORMAL %CL_AKEL4% '/Command(4101) /Command(4155)'
       Return
    Endif
    
    If Not FileExist(CL_AKEL4) Then 
       ShowHint("AkelPad не найден " & CL_AKEL4 & "Текст значений скопирован в буфер.")
    Else
       ShellExec /SW_SHOWNORMAL %CL_AKEL4% ' /Command(4155)'       
    Endif 
    
EndFunc

Func SetDefaultColor()
   If BACKDROP_THREAD > 0 Then
      ClipPut("-1")
      ShowBackHint("Установлен цвет по-умолчанию для " & CF_NAME)
   Else
      ShowHint("Отслеживание цвета не запущено")
   Endif   
EndFunc

# массивы значений из бар-файла 
Global aBarList  = List(), _
       aBarList2 = List()
       
# массивы резевных значений при ошибках чтения бар-файла
Global aBackList  = List(7566195, 7497811, 9865603, 8421230)
Global aBackList2 = List(7566195, 7497811, 9865603, 8421230)

# начальный фон
Global ColorStart = BackColor1 , ColorStart2 = BackColor2
# добавление начального фона к резерву
aBackList.Add(ColorStart)
aBackList2.Add(ColorStart2)

# Alt+Click активная панель
# использовать бар-файл для переключения фона
ControlSetMouseAction /L /K:A 3 SetColorNum 1
# Alt+Click неактивная панель
# использовать массив отката для переключения фона
ControlSetMouseAction /L /K:A 4 SetColorNum 2

# регистрация команды
# вызов из кнопки или пункта меню
RegisterCommand 70040 "SetColorNum"

Func SetColorNum(lParam)
Local bkg1, bkg2, blue, green, red, txt

   # удержание Win
   If lParam = 0 And IsPressed(0x5B) Then 
      If IsPressed(0x12) Then 
         SetPulsar 1
      ElseIf IsPressed(0x11) Then
         SetPulsar 2
      Endif   
      Return
   EndIf
   
   # удержание Alt
   If lParam = 0 And IsPressed(0x12) Then 
      If IsPressed(0x10) Then 
         SetPulsarDelay -10
      Else
         SetPulsarDelay +10
      Endif   
      Return
   EndIf

   # массивы для переключения цвета фона 
   Local aColorsList, aColorsList2
   # индекс цвета в массиве
   Static ColorIndex = -1

   # бар-файл по умолчанию
   If lParam = 0 Then lParam = 1
   
   # удержание Ctrl
   # использовать резевный массив 
   If IsPressed(0x11) Then lParam = 2
   
   # удержание Win
   # принудительное чтение бар-файла
   If lParam = 1 And IsPressed(0x5B) Then aBarList.Count = 0

   # инициализация массива из бар-файла
   If lParam = 1 And aBarList.Count = 0 Then
      If Not LoadColorBar() Then
         Sleep(1000)
         WinSetState(23)
         Return
      EndIf  
   EndIf
   
   If lParam = 1 Then
      aColorsList  = aBarList
      aColorsList2 = aBarList2     
   Else 
      aColorsList  = aBackList
      aColorsList2 = aBackList2      
   EndIf
   
   ColorIndex = ColorIndex + 1
   If ColorIndex > aColorsList.Count - 1 Then ColorIndex = 0
   
   bkg1 = aColorsList[ColorIndex]
   bkg2 = aColorsList2[ColorIndex]   
   
   WriteBackground(bkg1, bkg2)
   
   txt = "Фон " & ColorIndex + 1 & " из " &  aColorsList.Count & auLF & "Значение: " & bkg1
   
   If bkg1 = -1 Then bkg1 = 1*255 + 256*255 + 65536*255
   
   blue = floor(bkg1/65536)
   green = bkg1 - (blue * 65536)
   green = floor(green/256)
   red = bkg1 - (blue * 65536) - (green * 256)
   
   txt = txt & auLF & "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue   
   
   ShowHint(txt)

EndFunc

Func LoadColorBar()
Local i, b, b2, p, c, bar = CL_BAR, max = 1*255 + 256*255 + 65536*255
       
   If Not FileExist(bar) Then   
      ShowHint("Панель не существует: " & bar)
      Return 0
   Endif
   
   IniRead c %bar% "Buttonbar" "Buttoncount" -1
   
   If c = -1 Or IsInt(c) = false Then
      ShowHint("Панель повреждена: " & bar)
      Return 0    
   EndIf
   
   If c < 1 Then
      ShowHint("Количество кнопок < 1  " & bar)
      Return 0
   Endif

   # очистка от старых значений   
   aBarList.Count = 0
   aBarList2.Count = 0   
   
   For i = 1 To c
      # перебор ключей ParamN
      IniRead p %bar% "Buttonbar" %"'Param' & %i%" ""
      # маркер не найден      
      If Not StrPos(p, "BackColorsMessage") Then Continue
      # маркер найден - получить значение ключа ParamN  
      b =  StrTrim(StrPart(p, ",", 2))
      b2 = StrTrim(StrPart(p, ",", 3))
      b2 = StrPart(b2, ")", 1)     
      # корректное значение сохраненного фона
      If IsInt(b) And b >= 0 and b <= max Then
         aBarList.Add(b)
         # корректное значение второго фона         
         If IsInt(b2) And b2 >= 0 and b2 <= max Then
            aBarList2.Add(b2)
         Else 
            # некорректное значение второго фона                  
            aBarList2.Add(b)         
         EndIf    
      EndIf  
   Next

    # перебор не дал результата   
    If aBarList.Count = 0 Then
       ShowHint("Панель не содержит значений фона  " & auCRLF & bar)
       Return 0
    Endif    

   # значения найдены
   # добавление начального фона к массивам  
   aBarList.Add(ColorStart)
   aBarList2.Add(ColorStart2)   

   Return 1       
   
EndFunc

Func SetPulsarDelay(lParam)

   PulsarDelay += lParam
   
   If PulsarDelay > 200 Then PulsarDelay = 20
   If PulsarDelay < 20 Then PulsarDelay = 200
   
   IniWrite /R %COMMANDER_INI% "Autorun" "PulsarDelay" %PulsarDelay%
   
   ShowHint("Задержка автоперебора: " & PulsarDelay)
   Sleep(1000)
   WinSetState(23)
   
EndFunc
[/cut]
[cut]

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

TOTALCMD#BAR#DATA
70001

%COMMANDER_EXE%
Запустить/Остановить|Отслеживание цвета в буфере| |Ctrl - Понижение тонов|Ctrl+Shift - Повышение тонов|Alt - Вернуть первоначальный|Alt+Win - Вернуть предыдущий| |Shift - Показать значения|Alt+Shift - Скопировать в буфер

0
70001
[/cut]
[cut]

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

TOTALCMD#BAR#DATA
70040

%COMMANDER_EXE%
Смена фона из Backdrops.bar|Ctrl - Резервные значения фона|Alt (+Shift) - Параметры задержки|Win - Перечитать бар-файл|Win+Alt - Автоповышение тонов|Win+Ctrl - Автопонижение тонов


70040
[/cut]
[cut="Backdrops.bar"]

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

[Buttonbar]
Buttoncount=10
button1=wcmicons.dll,15
cmd1=%COMMANDER_PATH%\Bars\Main.bar
iconic1=0
button2=%COMMANDER_EXE%
cmd2=70002
iconic2=0
menu2=Сохранить фон
button3=
iconic3=0
button4=%COMMANDER_EXE%
cmd4=%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe
param4=/u- /ef "msg(regmsg(BackColorsMessage), 7566195, 7566195)
iconic4=0
menu4=Избранный фон 1
button5=%COMMANDER_EXE%
cmd5=%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe
param5=/u- /ef "msg(regmsg(BackColorsMessage), 9272934, 9272934)
iconic5=0
menu5=Избранный фон 2
button6=
iconic6=0
button7=%COMMANDER_EXE%
cmd7=%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe
param7=/u- /ef "msg(regmsg(BackColorsMessage), 9865603, 9865603)
iconic7=0
menu7=Фон 9865603, 9865603
button8=%COMMANDER_EXE%
cmd8=%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe
param8=/u- /ef "msg(regmsg(BackColorsMessage), 8483950, 9602431)
iconic8=0
menu8=Фон 8483950, 9602431
button9=%COMMANDER_EXE%
cmd9=%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe
param9=/u- /ef "msg(regmsg(BackColorsMessage), 7895151, 7895151)
iconic9=0
menu9=Фон 7895151, 7895151
button10=%COMMANDER_EXE%
cmd10=%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe
param10=/u- /ef "msg(regmsg(BackColorsMessage), 8552049, 7895151)
iconic10=0
menu10=Фон 8552049, 7895151
[/cut]
Там еше кнопка и комбинации для переключения сохраненого фона из бар-файла и пару приятных мелочей, включая статус готовности операций в заголовке.

Добавлено: Чт дек 05, 2024 10:25
Loopback
Orion9 писал(а):Проблема, похоже, не с функцией BigHint, а с IsPressed.
Выглядит похоже, но нет. Обратите внимание, что при нажатом Ctrl и другие подсказки не появляются. А если нажать Ctrl при активной подсказке - она сразу скрывается. Раз нет отображения подсказки - нет и запроса данных из плагинов. Соответственно, не происходит и вход в функцию Autorun.

Точно так же себя ведут и другие модификаторы - Shift, Alt, Win. Более того, эти модификаторы скрывают подсказку и в x86.

А вот что самое смешное: в тотале 10.51 x86 так же себя ведет и Ctrl. Т.е. возможность удерживать Ctrl не скрывая подсказку есть только в х86 версии тотала начиная где-то с 11 версии...

Добавлено: Чт дек 05, 2024 13:08
Orion9
Loopback писал(а):Выглядит похоже, но нет. Обратите внимание, что при нажатом Ctrl и другие подсказки не появляются. А если нажать Ctrl при активной подсказке - она сразу скрывается.
До смешного!.. А может, он (х64) таким же образом и MsgBox гасит? :lol:
Loopback писал(а):Точно так же себя ведут и другие модификаторы - Shift, Alt, Win. Более того, эти модификаторы скрывают подсказку и в x86.
Да, эту фишку я давненько просек. Иначе чем палками в колеса Autorun, это никак не назвать.)
Loopback писал(а):А вот что самое смешное: в тотале 10.51 x86 так же себя ведет и Ctrl. Т.е. возможность удерживать Ctrl не скрывая подсказку есть только в х86 версии тотала начиная где-то с 11 версии...
Выход есть - использовать Lock, с ним все работает даже в 64-х битном ТС. Пример с MI можно найти на предыдущей странице. Т.е. привязываться надо не к клавишам, а к переменной и ее состоянию. Понятно, что реальное нажатие на Ctrl и другие модификаторы так работать не будет, а ведь именно это иногда и требуется, если нужно по-быстрому вызвать дополнительную информацию в подсказке к какому-то единичному файлу. Но можно и локом, раз других вариантов нет.

Решил посидеть пока в TC x64 - посмотреть, что еще может пойти не так. Пока ничего не нашел, вроде. Хотя функционала на Autorun накопилось немало за все это время, т.ч. быстро проверить не получится.

WMI запроос:

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

SELECT Address, ResponseTime, ResponseTimeToLive, StatusCode FROM Win32_PingStatus WHERE BufferSize = 32 AND Timeout = 1000 AND (Address = "192.168.1.1" OR Address = "192.168.1.2" OR Address = "wincmd.ru")
Все так же приводит к ошибке "Неожиданная кавычка " в строке". Работает только запрос с одинарной кавычкой в обоих версиях разрядности:

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

SELECT Address, ResponseTime, ResponseTimeToLive, StatusCode FROM Win32_PingStatus WHERE BufferSize = 32 AND Timeout = 1000 AND (Address = '192.168.1.1' OR Address = '192.168.1.2' OR Address = 'wincmd.ru')
Предложение: GetState("envvars") - класс! А если бы еще была возможность выводить переменные окружения создаваемые только в Autorun? Было бы очень удобно.

Ну, и пара моментов по вчерашнему посту. Запуск отслеживания с зажатым Win переводит скрипт в режим тестирования цвета фона подсказки. Любые изменения в окне ColorMania или окна диалога цвета при нажатии Ctrl будут вызывать подсказку с цветом фона выбранного цвета. Идея была наглядно подбирать стили и цвета к подсказке, но пока идея недоделанная, хотя и рабочая (подсказки отображаются одна за другой). Теперь необязательно запускать окно ColorMania, поток может работать и со стандартным (системным) диалогом выбора цвета, который можно вызвать по-разному. Поскольку я больше ориентируюсь на Autohotkey, то нашел в сети скрипт для этого, но вы можете ипользовать и другие методы при необходимости.

[cut="ColorDialog.ahk"]

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

global cc, defColor
cc := 0x00FF00 
defColor := [0xAA0000,0x00AA00,0x0000AA]

cc := ColorSelect(cc,,&defColor,1)

ColorSelect(Color := 0, hwnd := 0, &custColorObj := "",disp:=false) {
    Static p := A_PtrSize
    disp := disp ? 0x3 : 0x1 ; init disp / 0x3 = full panel / 0x1 = basic panel
    
    If (custColorObj.Length > 16)
        throw Error("Too many custom colors.  The maximum allowed values is 16.")
    
    Loop (16 - custColorObj.Length)
        custColorObj.Push(0) ; fill out custColorObj to 16 values
    
    CUSTOM := Buffer(16 * 4, 0) ; init custom colors obj
    CHOOSECOLOR := Buffer((p=4)?36:72,0) ; init dialog
    
    If (IsObject(custColorObj)) {
        Loop 16 {
            custColor := RGB_BGR(custColorObj[A_Index])
            NumPut "UInt", custColor, CUSTOM, (A_Index-1) * 4
        }
    }
    
    NumPut "UInt", CHOOSECOLOR.size, CHOOSECOLOR, 0             ; lStructSize
    NumPut "UPtr", hwnd,             CHOOSECOLOR, p             ; hwndOwner
    NumPut "UInt", RGB_BGR(color),   CHOOSECOLOR, 3 * p         ; rgbResult
    NumPut "UPtr", CUSTOM.ptr,       CHOOSECOLOR, 4 * p         ; lpCustColors
    NumPut "UInt", disp,             CHOOSECOLOR, 5 * p         ; Flags
    
    if !DllCall("comdlg32\ChooseColor", "UPtr", CHOOSECOLOR.ptr, "UInt")
        return -1
    
    custColorObj := []
    Loop 16 {
        newCustCol := NumGet(CUSTOM, (A_Index-1) * 4, "UInt")
        custColorObj.InsertAt(A_Index, RGB_BGR(newCustCol))
    }
    
    Color := NumGet(CHOOSECOLOR, 3 * A_PtrSize, "UInt")
    return Format("0x{:06X}",RGB_BGR(color))
    
    RGB_BGR(c) {
        return ((c & 0xFF) << 16 | c & 0xFF00 | c >> 16)
    }
}
[/cut]
В последнее время вносил много изменений, но мало тестировал, т.ч. могут быть какие-нибудь огрехи или косяки. Если заметите что-то, пишите.)

Добавлено: Чт дек 05, 2024 17:39
Orion9
Loopback
Обнаружил тут, что если эмулировать нажатие Ctrl в Экранной клавиатуре, то все работает как часы ) И Alt и Shift тоже. Может, что-то можно из этого выжать? Ну, т.е. как-то подстроиться, изменить что-то в IsPressed... Хотя причем тут IsPressed, если x64-ый не пойми что делает с этими клавишами в окне панели :lol:

Добавлено: Чт дек 05, 2024 18:52
Loopback
Orion9 писал(а):А может, он (х64) таким же образом и MsgBox гасит?
Не, тут другое. Эта проблема до конца так и не решена.
Orion9 писал(а): Т.е. привязываться надо не к клавишам, а к переменной и ее состоянию.
В свете имеющихся ограничений только и остаётся.
Orion9 писал(а):Все так же приводит к ошибке "Неожиданная кавычка " в строке".
Да, тут что-то с обработкой параметров в Query(). Добавил в todo, позже разберусь.
Orion9 писал(а):А если бы еще была возможность выводить переменные окружения создаваемые только в Autorun?
Делать нативно еще и это избыточно, достаточно скриптового решения. Если надо, чтобы это работало при перезапусках, нужно еще сохранять исходные переменные в дополнительную переменную окружения, как в примере по сохранению заголовка в справке.

[cut]

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

# разместить в начале скрипта
Global InitEnvVars = GetState("envvars")

# где-то здесь создаем переменные

MsgBox(GetAutorunEnvVars(InitEnvVars))

Func GetAutorunEnvVars(PrevEnvVars)
    Local aPrev = List(), aCurr = List(), sEnv
    aPrev.Text = PrevEnvVars
    aCurr.Text = GetState("envvars")
    For i = aCurr.Count - 1 To 0 Step -1
        sEnv = StrPart(aCurr[i], "=", 1)
        For j = 0 To aPrev.Count - 1
            If sEnv = StrPart(aPrev[j], "=", 1) Then
                aCurr.Remove(i, 1)
                Break
            EndIf
        Next
    Next
    Local Res = aCurr.Text
    Free(aPrev)
    Free(aCurr)
    Return Res
EndFunc
[/cut]
Orion9 писал(а):Может, что-то можно из этого выжать?
Академические изыскания - это хорошо, но тут-то требуется нажатие физической кнопки.

Добавлено: Чт дек 05, 2024 19:15
Orion9
достаточно скриптового решения.
Да, что-то такое, помню, делалось... Надо будет пересмотреть код с учетом новых реалий - существование объекта List. Просто как бы само напрашивалось добавить GetState("envvars") подобный параметр, но можно и без него.

Я смотрю в справке появились уже значки восклицания с красивыми сносками, выглядит теперь очень профессионально :)

Добавлено: Вс дек 08, 2024 19:45
yahuu
В документации "Switching to version 3.x" страница "syntax_type" не была забыта при упаковке?
Гиперссылка соответствует файлу "syntax_type.html".

Я заметил, что русская версия справки и английская версия справки не совпадают. Какая из них является последней?

Добавлено: Вс дек 08, 2024 20:33
Loopback
yahuu писал(а):В документации "Switching to version 3.x" страница "syntax_type" не была забыта при упаковке?
Статьи "syntax_type" больше нет. Были очень большие изменения по общим разделам, эта статья убрана, а информация из неё распределена по другим статьям. Ссылка просто забыта.
yahuu писал(а):Я заметил, что русская версия справки и английская версия справки не совпадают. Какая из них является последней?
Основная и наиболее актуальная - русская. Значительные изменения добавляются сразу и в английскую версию. Но более мелкие (а их тоже много), конечно, отстают.

Актуализация английской справки начнется после окончания переработки русской версии.

Добавлено: Пн дек 09, 2024 13:21
Orion9
Смена фона одним кликом - это, конечно, хорошо, но все-таки недостаточно: расцветка файлов из шаблонов поиска остается той же и сам фон при резком изменении контраста сливается с цветом текста, что делает его бесполезным.

Для полноценного использования нужна не просто смена фона, а смена всей цветовой схемы.

Казалось бы, простейшее решение - поменять редирект в секции Colors, и вуаля:

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

[Colors]
RedirectSection=%COMMANDER_PATH%\Ini\Colors.ini
Но нет. Тотал не реагирует на такие трюки, пока не перезапустится. Поэтому пришлось выходить из ситуации переименованием ini-файлов.

Сейчас у меня, получается, три файла: Colors.ini, Colors2.ini и Colors3.ini. Каждый из которых содержит две секции из wincmd.ini - [Colors] и [ColorsDark]. В начале у каждого файла есть секция [ColorTheme], в которой находятся ключи описания темы, например:

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

[ColorTheme]
Name=White
Version=1.0
Description=Светлые тона
Instance=1
Или:

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

[ColorTheme]
Name=Black
Version=1.1
Description=Тёмные тона
Instance=2
Ключ Instance хранит номер темы, который используется для дальнейших расчетов при переключении на следующую тему.

Код еще сыроват (в нем нет должных проверок и возможности сохранять новые темы на лету), но уже вполне рабочий - со своей задачей цикличного переключения тем он справляется очень даже хорошо)
[cut]

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

# переключение цветовой схемы 
RegisterCommand 70051 "SwitchColors"

Func SwitchColors(lParam)
Local n = "Colors", f, p = %COMMANDER_PATH% & "\Ini\", _
      num, theme, desc
      
   # счетчик номеров      
   Static c = 0

   # оригинальный файл в ТС
   f = p & n & ".ini"
       
   IniRead num %f% "ColorTheme" "Instance" 0  
   IniRead desc %f% "ColorTheme" "Description" 
   IniRead theme %f% "ColorTheme" "Name" 

    # lParam 0 - вызов из кнопки
    If lParam = 0 And IsPressed (0x12) Then
       ShowHint("Тема: " & theme & auCRLF & "Описание: " & desc & auCRLF & "Номер: " & num)
       Return
    EndIf    
   
   # текущий номер темы
   c = num
   If c >= 3 Then c = 0
   
   # следующий номер темы   
   c += 1
   
   # текущая -> предыдущая
   prev_theme = p & n & num & ".ini"
   # следующая по номеру тема   
   next_theme = p & n & c & ".ini"
   
   # имя файла в ТС
   tc_name = n & ".ini"
   
   prev_name = n & num & ".ini"
   next_name = n & c & ".ini"  

   If lParam = 0 And IsPressed (0x11) Then
      ShowHint(prev_theme & auCRLF & next_theme)
      Return
   EndIf   
   
   If Not FileExist(next_theme) Then
      ShowHint("Next number error: " & auCRLF & "File: " & next_theme)
      Return
   EndIf
   
   ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% '/c rename "%f%" %prev_name%'
   ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% '/c rename "%next_theme%" %tc_name%'  
   
   SendCommand 2957
   SendCommand 2957 
   
    # lParam 1 - вызов с указанием параметра
    If lParam = 1  Then
       IniRead num %f% "ColorTheme" "Instance" 0  
       IniRead desc %f% "ColorTheme" "Description" 
       IniRead theme %f% "ColorTheme" "Name"     
       ShowHint("Тема: " & theme & auCRLF & "Описание: " & desc & auCRLF & "Номер: " & num)
    EndIf     
   
EndFunc
[/cut]
[cut="Кнопка"]TOTALCMD#BAR#DATA
70051

%COMMANDER_EXE%
Переключение темы|Alt - Информация о схеме|Ctrl - Отладочная информация


70051
[/cut]
Сделал себе пока три темы, сижу и кайфую) С детства мечтал переключать что-нибудь как хЫшный планетянин. И вот теперь благодаря могуществу Autorun эта мечта сбылась :lol:
[cut="P.S."]Мощь Autorun не знает границ (с) К.Гислер[/cut]
[cut="Disclaimer"]Конечно, такого он не говорил.[/cut]
[cut="Exclaimer"]Но думал :mrgreen:[/cut]

Добавлено: Вт дек 10, 2024 13:25
sa
Orion9 писал(а):Удерживая Ctrl и водя курсором мыши по палитре цветов - изменения отображаются мгновенно.
И ведь я поверил! :D Ничего невозможного уже нет! Но всё-таки пришлось не только водить, но и нажимать периодически левую клавишу.
Глубоко не копал, но скрипт работал исправно.
С фоном подсказки - по-разному, в зависимости от источника для палитры цветов.

Добавлено: Ср дек 11, 2024 00:18
Orion9
sa писал(а):Ничего невозможного уже нет!
С каждой новой версией Autorun я убеждаюсь в этом все больше и больше :)

Действительно темы теперь можно создавать легко и просто, а главное делать это приятно. Обновил модуль:
[cut]

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

# Ctrl+Shift+"+" 	- 	Повышение тонов
# Ctrl+Shift+"-" 	- 	Понижение тонов
# Ctrl+"+" 		- 	Автоповышение тонов
# Ctrl+"-" 		- 	Автопонижение тонов
# ESC 			- 	Выход из автоперебора
# Alt+"+" 		- 	Показ текущих значений
# Alt+Shift+"+" 	- 	Повышение тона зебра
# Alt+Shift+"-" 	- 	Понижение тона зебра
# Alt+Click (Активная)	-	Переключение фона из Backdrops.bar
# Alt+Click (Целевая)	-	Переключение резервных значений фона

Pragma IncludeOnce

Global Pulsar = 0, PulsarDelay = 50, BACKDROP_THREAD = 0, BackColor1 = 0, BackColor2 = 0, Previous1 = 0, Previous2 = 0

Global CF_NAME = "", CF_VALUE = -1, CF_KEY = 0, CF_COLOR_KEY = 0, WRITE_COLOR_MODE = 0, CL_KEY = "", CL_VALUE = -1, CL_SNAP = ""

Global CL_MousePosX = 0, CL_MousePosY = 0, TEST_HINT = 0

# задержка автоперебора
IniRead /R PulsarDelay %COMMANDER_INI% "Autorun" "PulsarDelay" 50

# панель для запоминания
Global CL_BAR = %COMMANDER_PATH% & "\Bars\Backdrops.bar"
# путь к редактору
Global CL_AKEL4 = %COMMANDER_PATH% & "\Utilites\AkelPad\AkelPad.exe", CL_TCFS2 = ""

# путь к TCFS2 для отправки сообщений
Set /EV- CL_TCFS2 "%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe"

# повышение/понижение тонов
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

# повышение/понижение тона зебра
SetHotkeyAction /K:A /K:S /V:187 /R /DM SetBackGround 1 1
SetHotkeyAction /K:A /K:S /V:189 /R /DM SetBackGround 2 1

# показать текущие значения
SetHotkeyAction /K:A /V:187 ShowBackColor 1000

# 70000-70050

# первоначальные значения цветов
# 0 - запомнить 
# 1 - открыть в редакторе
RegisterCommand 70000 "InitialColors" 1

# регистрация команды для вызова из кнопки (пункта меню)
RegisterCommand 70001 "AutoBackdrop"

# запоминание текущего фона
RegisterCommand 70002 "BackColorBar"

# создание и отображение меню
RegisterCommand 70003 "ShowBackdropMenu"

# ключи секции [Color]
RegisterCommand 70004 "ColorItem" "Backdrop"
RegisterCommand 70005 "ColorItem" "MarkColor"
RegisterCommand 70006 "ColorItem" "CursorColor"
RegisterCommand 70007 "ColorItem" "ForeColor"
RegisterCommand 70008 "ColorItem" "CursorText"
RegisterCommand 70009 "ColorItem" "BackColor"
RegisterCommand 70010 "ColorItem" "BackColor2"

# ключи ColorFilter секции [Color]
RegisterCommand 70011 "ColorFilterItem" 1
RegisterCommand 70012 "ColorFilterItem" 2
RegisterCommand 70013 "ColorFilterItem" 3
RegisterCommand 70014 "ColorFilterItem" 4
RegisterCommand 70015 "ColorFilterItem" 5
RegisterCommand 70016 "ColorFilterItem" 6
RegisterCommand 70017 "ColorFilterItem" 7
RegisterCommand 70018 "ColorFilterItem" 8
RegisterCommand 70019 "ColorFilterItem" 9
RegisterCommand 70020 "ColorFilterItem" 10
RegisterCommand 70021 "ColorFilterItem" 11
RegisterCommand 70022 "ColorFilterItem" 12
RegisterCommand 70023 "ColorFilterItem" 13
RegisterCommand 70024 "ColorFilterItem" 14
RegisterCommand 70025 "ColorFilterItem" 15

# управление потоком
RegisterCommand 70050 "BackdropAction" 0

# прием сообщения окну "установить значения фона"
SetMessageAction /P "BackColorsMessage" SetBackColors

# значения фона при старте ТС
If BackColor1 = 0 or BackColor2 = 0 Then
   IniRead /R BackColor1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R BackColor2 %COMMANDER_INI% "Colors" "BackColor2" -1
Endif

Func BackdropAction(lParam, lAction)
   BACKDROP_THREAD = lAction
EndFunc

Func InitialColors(lParam, lMode)
Local i = 0, cf, txt

   If lMode = 1 Then
      # вызов пункта меню для показа значений
      OpenInTextEditor(CL_SNAP)
      Return 
   Endif
   
   # снимок первоначальных значений 
   CL_SNAP = ";значения секции при запуске ТС" & auCRLF
   CL_SNAP = CL_SNAP & "[Colors]" & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "ForeColor" -1   
   CL_SNAP = CL_SNAP & "ForeColor=" & txt & auCRLF   
   
   IniRead /R txt %COMMANDER_INI% "Colors" "BackColor" -1
   CL_SNAP = CL_SNAP & "BackColor=" & txt & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "BackColor2" -1   
   CL_SNAP = CL_SNAP & "BackColor2=" & txt & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "MarkColor" -1   
   CL_SNAP = CL_SNAP & "MarkColor=" & txt & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "CursorColor" -1   
   CL_SNAP = CL_SNAP & "CursorColor=" & txt & auCRLF
  
   IniRead /R txt %COMMANDER_INI% "Colors" "CursorText" -1   
   CL_SNAP = CL_SNAP & "CursorText=" & txt & auCRLF            

   While i < 100
   
      i = i + 1
   
      IniRead /R cf %COMMANDER_INI% "Colors" %"'ColorFilter' & %i%" "stop"
      If cf="stop" Then Break
      
      IniRead /R txt %COMMANDER_INI% "Colors" %"'ColorFilter' & %i% & 'Color'"
      CL_SNAP = CL_SNAP & cf & "=" & txt & auCRLF            
               
   Wend
   
EndFunc
  
Func AutoBackdrop(lParam)
Static StartCount = 0

   # удержание Win
   # тестирование фона подсказки
   If BACKDROP_THREAD = 0 And IsPressed (0x5B) Then TEST_HINT = 1

   # удержание Ctrl+Shift
   # повышение тона на одну единицу при нажатии
   # на кнопку, выборе пункта меню или вызове другим способом
   If IsPressed (0x10) And IsPressed (0x11) Then Return SetBackGround(1)
   
   # удержание Ctrl
   # понижение тона на одну единицу
   If IsPressed (0x11) Then Return SetBackGround(2)
   
   # удержание Alt+Win
   # вернуть предыдущий фон
   If IsPressed (0x12) And IsPressed (0x5B) Then
      If Previous1 > 0 or Previous2 > 0 Then WriteBackground(Previous1, Previous2)
      Return 
   Endif
   
   # удержание Alt+Shift
   # скопировать в буфер код кнопки текущего фона  
   If IsPressed (0x12) And IsPressed (0x10) Then
      IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
      IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
      ClipPut("TOTALCMD#BAR#DATA" & auCRLF & CL_TCFS2 & auCRLF & _
              "/u- /ef ""msg(regmsg(BackColorsMessage), " & bkg1 & ", " & bkg2 & ")""" & auCRLF & "%COMMANDER_EXE%")
      ShowBackHint("Кнопка с фоном скопирована")
      Return
   Endif
   
   # удержание Alt
   # вернуть первоначальный фон TC
   If IsPressed (0x12) Then Return WriteBackground(BackColor1, BackColor2)
   
   # удержание Shift
   # показ текущих значений фона
   If IsPressed (0x10) Then Return ShowBackColor()   
   
   # поток уже запущен
   If BACKDROP_THREAD > 0 Then
      If TEST_HINT = 1 Then
         ShowHint("Режим TEST_HINT выключен")
         TEST_HINT = 0
         Sleep(700)         
         BACKDROP_THREAD = 0
         Return
      Endif
      ShowPopupMenu /D /F "CreateBackdropMenu"
   Else
      tc = ProcessCount("TOTALCMD.EXE") + ProcessCount("TOTALCMD64.EXE")
      If tc > 1 Then
         ShowHint("Запущено " & tc & " процесса Total Commander" & auLF & _
                  "Для корректной работы требуется только одна копия TOTALCMD")
         Return
      EndIf
      If StartCount = 0 Then InitialColors(0, 0)
      BACKDROP_THREAD = 1
      If TEST_HINT Then 
         CF_NAME = "HINT TEST MODE" 
      Else
         # при старте парное значение фона по умолчанию
         ColorItem(1, "Backdrop")      
      Endif        
      RunThread ThreadBackdrop
      StartCount = StartCount + 1
      SetHintParam("ShowHint", "Font", 10, "Tahoma")
      SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
      SetHintParam("ShowHint", "Text", 0xFFFFFF)
      #SetHintParam("ShowHint", "Frame", 0xFFFFFF)       
      ShowHint("Отслеживание запущено." & auLF & _
               "CTRL - Применение цвета в окне ColorMania" & auLF & auLF & _
               "SHIFT - откат, ALT - умолчание, WIN - буфер")  
      Sleep(2000)
      #WinSetState(23)
      SetHintParam("ShowHint", "Reload")      
   Endif
   		
EndFunc

# прием сообщения
Func SetBackColors(hWnd, uMsg, wParam, lParam)
     WriteBackground(wParam, lParam) 
EndFunc

# запись парных значений
Func WriteBackground(Color1, Color2)
     IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %Color1%
     IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %Color2%
     # обновление панелей
     SendCommand 2957
     SendCommand 2957
EndFunc

# запись одиночных значений
Func WriteSingleColor(KeyName, KeyValue)
     IniWrite /R %COMMANDER_INI% "Colors" %"%KeyName%" %KeyValue%
     SendCommand 2957
     SendCommand 2957
EndFunc

Func TestHintParam(ParamName, ParamValue, handle)
Local blue, green, red

    blue = floor(ParamValue/65536)
    green = ParamValue - (blue * 65536)
    green = floor(green/256)
    red = ParamValue - (blue * 65536) - (green * 256)
    
    SetHintParam("ShowHint", ParamName, 1*blue + 256*green + 65536*red)
    #SetHintParam("ShowHint", "Text", 0xFFFFFF)
    
    ShowHint("Test text" & auCRLF & "Hex " & Hex(ParamValue, 6) & auCRLF & "Dec " & ParamValue & auLF & _
             "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue)
    Sleep(100)
    SetHintParam("ShowHint", "Reload")
    WinSetState(23, handle)
EndFunc

# функция работает в отдельном потоке
Func ThreadBackdrop()
Local h = 0, r, g, b, c, max = 1*255 + 256*255 + 65536*255, clip, last = -1, w = 0, v = 0, action, state

   # предыдущие значения фона
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
   
   While BACKDROP_THREAD = 1

       # поиск окна Color Dialog Box
       h = WinFind(0, "#32770", "Цвет")
       If h > 0 Then
          action = "Color Dialog Box  > "
          If WinGetState(4, h) Then 
             action = action & "Active  > "
             r = WinGetText(WinFind(h, "Edit", 4))
             g = WinGetText(WinFind(h, "Edit", 5))
             b = WinGetText(WinFind(h, "Edit", 6))
             # непустые поля редактирования
             If Not (StrLen(r) = 0 And StrLen(g) = 0) Then
                c = 1*r + 256*g + 65536*b             
                action = action & "Ready to apply RGB: " & r & ", " & g & ", " & b
             Else
                action = action & "RGB Unreachable"    
             EndIf       
          Endif    
       Else    
          # поиск окна ColorMania
          h = WinFind(0, "TfrmColorPick")       
          If h > 0 Then
             action = "ColorMania  > "
             If WinGetState(4, h) Then 
                action = action & "Active  > "
                c = WinGetText(WinFind(h, "TEdit", 1))
                action = action & "Ready to apply value: " & c
             Endif    
          EndIf        
       EndIf      
                 
       If h > 0 And WinGetState(4, h) > 0 Then
          If IsPressed (0x11) Then       
             # удержание CTRL 
             # значение активного окна
             If StrLen(c) > 0 Then
                clip = c
                action = "Applying " & clip
             Endif            
          ElseIf IsPressed (0x12) Then
             # удержание ALT       
             # значение по умолчанию
             clip = "-1"
             action = "Applying -1"
          ElseIf IsPressed (0x10) Then
             # удержание SHIFT            
             # предыдущее значение
             clip = CL_VALUE
             action = "Undo " & clip             
          ElseIf IsPressed (0x5B) Then
             # удержание WIN              
             # первая строка в буфере 
             clip = StrPart(ClipGet(), auLF, 1)
             action = "Clipboard " & clip           
          ElseIf IsPressed (0x1B) Then
             ColorSync(CL_VALUE)
             action = "Color Sync " & clip 
          Endif          
          If CL_KEY = 'CursorColor' Or CL_KEY = 'CursorText' Then 
             If IsPressed (0x11) Or IsPressed (0x12)  Or IsPressed (0x10) Or IsPressed (0x5B) Then WinSetState(23)
          EndIf   

       ElseIf h > 0 And WinGetState(4, h) = 0 Then
          action = action & "Not Active"
       Else       
          action = "Waiting for a window..."
       Endif
          
       If IsInt(clip) Then
          # новое число в диапазоне
          If clip >= -1 And clip <= max And Not (clip = last) Then
              
             If TEST_HINT = 1 Then 
                CF_NAME = "HINT TEST MODE"
                WRITE_COLOR_MODE = 3
             EndIf   
                       
             If WRITE_COLOR_MODE = 0 Then
                WriteBackground(clip, clip)
                w = w + 1
             ElseIf WRITE_COLOR_MODE = 1 Then
                WriteSingleColor(CL_KEY, clip)
                v = v + 1
             Else
                TestHintParam('BackColor', clip, h)
                v = v + 1                                
             Endif
             last = clip
             Sleep(100)
          Endif
       Endif
       
       Sleep(250)
       WinSetText("Changing colors  > " & CF_NAME & "  > " & action  )
       
   Wend
   BACKDROP_THREAD = 0
   WinSetText("")
   WinRedraw
   
   SetHintParam("ShowHint", "Font", 10, "Tahoma")
   SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
   SetHintParam("ShowHint", "Text", 0xFFFFFF)
   
   ShowHint("Отслеживание остановлено" & auLF & _
            "Применений фона: " & w & auLF & _
            "Применение других значений: " & v)
            
   Sleep(2000)
   WinSetState(23)
   SetHintParam("ShowHint", "Reload")   
EndFunc

Func SetBackGround(nParam, nZebra = 0)
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 Not IsInt(bkg1) Or Not IsInt(bkg2) Then
      MsgBox("Нечисловые значения цвета фона: " & auLF & auLF & _
              "BackColor=" & bkg1 & auLF & "BackColor2=" & bkg2 & auLF & auLF & _
              "ESC - Отмена операции")
      Return
   Endif
   
   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
   
   If nZebra Then
      WriteSingleColor("BackColor2", bkg2)
   Else
      WriteBackground(bkg1, bkg2)
   Endif
   
EndFunc

Func SetPulsar(nParam)
local a, b, s, l
static t = 0
   
   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
   
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
  
   While Pulsar = 1
   
      For j = a To b step s
      
         For i = 1 To 75
             
             SetBackGround(j)
             # значение можно увеличить
             # если мерцает только одна панель
             Sleep(PulsarDelay)
             l = l + 1
             t = t + 1
             
             If Pulsar = 0 Then Break
             
             If IsPressed (0x1B) Then
                Pulsar = 0
                Break
             Endif
             
         Next
         
         If Pulsar = 0 Then Break
      Next
      
   Wend
   # показать статистику, если выход по ESC
   If IsPressed (0x1B) Then
      ShowHint("Изменений тонов: " & l & auCRLF & "Всего изменений: " & t)
   Endif    
EndFunc 

Func ShowBackColor(lDelay = 300)
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

Func BackColorBar(lParam)
Local i, bkg1, bkg2, bar = CL_BAR
       
   If Not FileExist(bar) Then   
      MsgBox("Файл не существует " & bar, "Backdrop")
      Return
   Endif
   
   IniRead i %bar% "Buttonbar" "Buttoncount" 0
   
   If Not IsInt(i) or i < 1 Then
      MsgBox("Ошибка Buttoncount < 1 " & auCRLF & bar, "Backdrop")
      Return
   Endif
   
   IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1   
   
   i = i + 1
  
   IniWrite /EV- %bar% "Buttonbar" %"'Button' & %i%" "%COMMANDER_EXE%"
   IniWrite %bar% "Buttonbar" %"'Cmd' & %i%"    "%CL_TCFS2%"
   IniWrite %bar% "Buttonbar" %"'Param' & %i%"  '"/u- /ef "msg(regmsg(BackColorsMessage), %bkg1%, %bkg2%)"'      
   IniWrite %bar% "Buttonbar" %"'Menu' & %i%"   "Фон %bkg1%, %bkg2%"   
          
   IniWrite %bar% "Buttonbar" "Buttoncount" %i%
   
   ShowBackHint("Фон панелей сохранен")
   
EndFunc

Func ShowBackHint(BackHint, PosX = false)

   SetHintParam("ShowHint", "Font", 10, "Arial")
   SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
   SetHintParam("ShowHint", "Text", 0xFFFFFF)
   
   If PosX Then
      ShowHint(BackHint, CL_MousePosX, CL_MousePosY)   
   Else
      ShowHint(BackHint)
   Endif
   
   Sleep(1000)
   WinSetState(23)
   
   SetHintParam("ShowHint", "Reload")
   
EndFunc

Func CreateBackdropMenu()
Local i = 0, cf, txt

   txt = txt & 'MENUITEM "Остановить отслеживание", 70050' & auCRLF
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF
   txt = txt & 'MENUITEM "Фон\tBackground", 70004' & auCRLF   
   txt = txt & 'MENUITEM "Выделение\tMarkColor", 70005' & auCRLF
   txt = txt & 'MENUITEM "Курсор\tCursorColor", 70006' & auCRLF
   txt = txt & 'MENUITEM "Текст\tForeColor", 70007' & auCRLF
   txt = txt & 'MENUITEM "Текст под курсором\tCursorText", 70008' & auCRLF
   txt = txt & 'MENUITEM "Фон 1\tBackColor", 70009' & auCRLF
   txt = txt & 'MENUITEM "Фон 2\tBackColor2", 70010' & auCRLF
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF   

   While i < 100
   
      i = i + 1
   
      IniRead /R cf %COMMANDER_INI% "Colors" %"'ColorFilter' & %i%" "stop"
      If cf="stop" Then Break
                       
      txt = txt & 'MENUITEM "' & cf & '", 700' & 10+i & auCRLF
      
   Wend
   
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF 
   If BACKDROP_THREAD > 0 Then
      txt = txt & 'MENUITEM "Текущий элемент - ' & CF_NAME & '", 70050'  & auCRLF
   EndIf
   txt = txt & 'MENUITEM "Первоначальные значения секции [Colors]", 70000'
   
   Return txt
EndFunc

Func ShowBackdropMenu(lParam)
    
    # вызов с Shift
    # копировать значение -1 в буфер
    If IsPressed(0x10) Then 
       SetDefaultColor
       Return
    EndIf
    
    # координаты кнопки вызова меню
    MouseGetPos("CL_MousePosX", "CL_MousePosY")
    ShowPopupMenu /D /F "CreateBackdropMenu"
    
EndFunc

Func ColorFilterItem(lParam, wItem)

    Local key1, key2, val1, val2
    
    If BACKDROP_THREAD = 0 Then
       ShowHint("Отслеживание цвета не запущено")
       Return
    Endif

    key1 = "ColorFilter" & wItem
    key2 = key1 & "Color"
    
    IniRead /R val1 %COMMANDER_INI% "Colors" %"%key1%" ""
    IniRead /R val2 %COMMANDER_INI% "Colors" %"%key2%" ""
    
    # формат "ColorFilter1"
    CF_KEY = key1
    # формат "ColorFilter1Color"
    CF_COLOR_KEY = key2
    # формат "Имя фильтра", например "Autorun"    
    CF_NAME = val1
    # формат "Цвет фильтра", например "65535"
    CF_VALUE = val2

    # глобальные значения для потока    
    CL_KEY = CF_COLOR_KEY
    CL_VALUE = CF_VALUE

    # режим записи "Одиночный ключ"      
    WRITE_COLOR_MODE = 1

    ColorItemChange(CL_VALUE)    
    ShowBackHint("Цвет типа выбран" & auCR & "Значения будут применятся к " & CF_NAME, false)
    
EndFunc

Func ColorItem(lParam, sItem)
Local key, val

    If BACKDROP_THREAD = 0 Then
       ShowHint("Отслеживание цвета не запущено")
       Return
    Endif
    
    # парный однотонный фон BackColor = BackColor2
    If sItem = "Backdrop" Then
       # режим записи "Парный ключ"       
       WRITE_COLOR_MODE = 0
       # Имя для потока
       CF_NAME = "Background"
       IniRead /R val %COMMANDER_INI% "Colors" "BackColor" -1
       # значение цвета
       CL_VALUE = val
       ColorItemChange(CL_VALUE)       
       # запуск из меню
       If lParam = 0 Then
          ShowBackHint("Цвет типа выбран" & auCR & "Значения будут применятся к " & CF_NAME)                     
       Endif
       Return      
    Endif
    
    key = sItem
    IniRead /R val %COMMANDER_INI% "Colors" %"%key%" ""

    # глобальные значения для потока        
    CL_KEY = key
    CL_VALUE = val
    CF_NAME = key
    WRITE_COLOR_MODE = 1

    ColorItemChange(CL_VALUE)
    ShowBackHint("Цвет типа выбран" & auCR & "Значения будут применятся к " & CF_NAME, false)
    
EndFunc

# не применять изменения цвета при смене элемента
Func ColorItemChange(ColorText)
    # очистка буфера при смене элемента
    ClipPut(ColorText) 
    # ColorSync(ColorText)
EndFunc

Func ColorSync(ColorText)

    Local h = WinFind(0, "TfrmColorPick")
    If h > 0 Then
        # синхронизация цвета с окном ColorMania 
        WinSetText(ColorText, WinFind(h, "TEdit", 1))
        b = WinFind(h, "TButton", 2)
        SendMessage(b, 0xF5, 0, 0)
    Endif
    
EndFunc

Func OpenInTextEditor(Text)
Local h = 0

    ClipPut(Text)
    
    h = WinFind(0, "AkelPad4")
    If h > 0 Then
       ShellExec /SW_SHOWNORMAL %CL_AKEL4% '/Command(4101) /Command(4155)'
       Return
    Endif
    
    If Not FileExist(CL_AKEL4) Then 
       ShowHint("AkelPad не найден " & CL_AKEL4 & "Текст значений скопирован в буфер.")
    Else
       ShellExec /SW_SHOWNORMAL %CL_AKEL4% ' /Command(4155)'       
    Endif 
    
EndFunc

Func SetDefaultColor()
   If BACKDROP_THREAD > 0 Then
      ClipPut("-1")
      ShowBackHint("Установлен цвет по-умолчанию для " & CF_NAME)
   Else
      ShowHint("Отслеживание цвета не запущено")
   Endif   
EndFunc

# массивы значений из бар-файла 
Global aBarList  = List(), _
       aBarList2 = List()
       
# массивы резевных значений при ошибках чтения бар-файла
Global aBackList  = List(7566195, 7497811, 9865603, 8421230)
Global aBackList2 = List(7566195, 7497811, 9865603, 8421230)

# начальный фон
Global ColorStart = BackColor1 , ColorStart2 = BackColor2
# добавление начального фона к резерву
aBackList.Add(ColorStart)
aBackList2.Add(ColorStart2)

# Alt+Click активная панель
# использовать бар-файл для переключения фона
ControlSetMouseAction /L /K:A 3 SetColorNum 1
# Alt+Click неактивная панель
# использовать массив отката для переключения фона
ControlSetMouseAction /L /K:A 4 SetColorNum 2

# регистрация команды
# вызов из кнопки или пункта меню
RegisterCommand 70040 "SetColorNum"

Func SetColorNum(lParam)
Local bkg1, bkg2, blue, green, red, txt

   # удержание Win (клик на панели)
   # смена цветовой схемы
   If lParam = 1 And IsPressed(0x5B) Then
      SwitchColors(1)
      Return
   EndIf

   # удержание Win (вызов из кнопки)
   If lParam = 0 And IsPressed(0x5B) Then 
      If IsPressed(0x12) Then 
         SetPulsar 1
         Return
      ElseIf IsPressed(0x11) Then
         SetPulsar 2
         Return
      Endif   
   EndIf
   
   # удержание Alt (вызов из кнопки)
   If lParam = 0 And IsPressed(0x12) Then 
      If IsPressed(0x10) Then 
         SetPulsarDelay -10
      Else
         SetPulsarDelay +10
      Endif   
      Return
   EndIf

   # массивы для переключения цвета фона 
   Local aColorsList, aColorsList2
   # индекс цвета в массиве
   Static ColorIndex = -1

   # массив из бар-файла по умолчанию
   If lParam = 0 Then lParam = 1
   
   # удержание Ctrl
   # использовать резевный массив 
   If IsPressed(0x11) Then lParam = 2
   
   # удержание Win
   # принудительное чтение бар-файла
   If lParam = 1 And IsPressed(0x5B) Then aBarList.Count = 0

   # инициализация массива из бар-файла
   If lParam = 1 And aBarList.Count = 0 Then
      If Not LoadColorBar() Then
         Sleep(1000)
         WinSetState(23)
         Return
      EndIf  
   EndIf
   
   If lParam = 1 Then
      aColorsList  = aBarList
      aColorsList2 = aBarList2     
   Else 
      aColorsList  = aBackList
      aColorsList2 = aBackList2      
   EndIf
   
   ColorIndex = ColorIndex + 1
   If ColorIndex > aColorsList.Count - 1 Then ColorIndex = 0
   
   bkg1 = aColorsList[ColorIndex]
   bkg2 = aColorsList2[ColorIndex]   
   
   WriteBackground(bkg1, bkg2)
   
   txt = "Фон " & ColorIndex + 1 & " из " &  aColorsList.Count & auLF & "Значение: " & bkg1
   
   If bkg1 = -1 Then bkg1 = 1*255 + 256*255 + 65536*255
   
   blue = floor(bkg1/65536)
   green = bkg1 - (blue * 65536)
   green = floor(green/256)
   red = bkg1 - (blue * 65536) - (green * 256)
   
   txt = txt & auLF & "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue   
   
   ShowHint(txt)

EndFunc

Func LoadColorBar()
Local i, b, b2, p, c, bar = CL_BAR, max = 1*255 + 256*255 + 65536*255
       
   If Not FileExist(bar) Then   
      ShowHint("Панель не существует: " & bar)
      Return 0
   Endif
   
   IniRead c %bar% "Buttonbar" "Buttoncount" -1
   
   If c = -1 Or IsInt(c) = false Then
      ShowHint("Панель повреждена: " & bar)
      Return 0    
   EndIf
   
   If c < 1 Then
      ShowHint("Количество кнопок < 1  " & bar)
      Return 0
   Endif

   # очистка от старых значений   
   aBarList.Count = 0
   aBarList2.Count = 0   
   
   For i = 1 To c
      # перебор ключей ParamN
      IniRead p %bar% "Buttonbar" %"'Param' & %i%" ""
      # маркер не найден      
      If Not StrPos(p, "BackColorsMessage") Then Continue
      # маркер найден: значение ключа ParamN  
      b =  StrTrim(StrPart(p, ",", 2))
      b2 = StrTrim(StrPart(p, ",", 3))
      b2 = StrPart(b2, ")", 1)     
      # корректное значение сохраненного фона
      If IsInt(b) And b >= 0 and b <= max Then
         aBarList.Add(b)
         # корректное значение второго фона         
         If IsInt(b2) And b2 >= 0 and b2 <= max Then
            aBarList2.Add(b2)
         Else 
            # некорректное значение второго фона                  
            aBarList2.Add(b)         
         EndIf    
      EndIf  
   Next

    # перебор не дал результата   
    If aBarList.Count = 0 Then
       ShowHint("Панель не содержит значений фона  " & auCRLF & bar)
       Return 0
    Endif    

   # значения найдены
   # добавление начального фона к массивам  
   aBarList.Add(ColorStart)
   aBarList2.Add(ColorStart2)   

   Return 1       
   
EndFunc

Func SetPulsarDelay(lParam)

   PulsarDelay += lParam
   
   If PulsarDelay > 200 Then PulsarDelay = 20
   If PulsarDelay < 20 Then PulsarDelay = 200
   
   IniWrite /R %COMMANDER_INI% "Autorun" "PulsarDelay" %PulsarDelay%
   
   ShowHint("Задержка автоперебора: " & PulsarDelay)
   Sleep(1000)
   WinSetState(23)
   
EndFunc

# переключение цветовой схемы 
RegisterCommand 70051 "SwitchColors"

Func SwitchColors(lParam)
Local n = "Colors", f, p = %COMMANDER_PATH% & "\Ini", _
      num, theme, desc
      
   # счетчик номеров      
   Local c = 0

   # оригинальный файл в ТС
   f = p & n & ".ini"
       
   IniRead num %f% "ColorTheme" "Instance" 0  
   IniRead desc %f% "ColorTheme" "Description" 
   IniRead theme %f% "ColorTheme" "Name" 

    # lParam 0 - вызов из кнопки
    If lParam = 0 And IsPressed (0x12) Then
       ShowHint("Тема: " & theme & auCRLF & "Описание: " & desc & auCRLF & "Номер: " & num)
       Return
    EndIf
    
   If Not IsInt(num) Then
      ShowHint("Значение Instance не является числом: " & num)
      Return
   Endif
   
   If num < 0 And num > 5 Then
      ShowHint("Значение Instance выходит за границы: " & num)
      Return
   Endif
   
   # текущий номер темы
   c = num
   If c >= 5 Then c = 0
   
   # следующий номер темы   
   c += 1
   
   # текущая -> предыдущая
   prev_theme = p & n & num & ".ini"
   # следующая по номеру тема   
   next_theme = p & n & c & ".ini"
   
   # имя файла в ТС
   tc_name = n & ".ini"
   
   prev_name = n & num & ".ini"
   next_name = n & c & ".ini"  

   If lParam = 0 And IsPressed (0x11) Then
      ShowHint(prev_theme & auCRLF & next_theme)
      Return
   EndIf   
   
   If Not FileExist(next_theme) Then
      c = 1
      If c = num Then 
         ShowHint("Не удалось переключиться на тему." & auCRLF & "Файл: " & next_theme)
         Return
      Endif
      next_theme = p & n & c & ".ini"
      If Not FileExist(next_theme) Then
         ShowHint("Не удалось переключиться на тему." & auCRLF & "Файл: " & next_theme)
         Return
      Endif      
   EndIf
   
   ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% '/c rename "%f%" %prev_name%'
   If FileExist(f) Then
      ShowHint("Не удалось переименовать " & f & " в " & prev_name)
      Return
   Endif
   
   ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% '/c rename "%next_theme%" %tc_name%'  
   If FileExist(next_theme) Then
      ShowHint("Не удалось переименовать " & next_theme & " в " & tc_name)
      Return
   Endif
   
   SendCommand 2957
   SendCommand 2957 
   
    # lParam 1 - вызов с указанием параметра
    If lParam = 1  Then
       IniRead num %f% "ColorTheme" "Instance" 0  
       IniRead desc %f% "ColorTheme" "Description" 
       IniRead theme %f% "ColorTheme" "Name"     
       ShowHint("Тема: " & theme & auCRLF & "Описание: " & desc & auCRLF & "Номер: " & num)
    EndIf     
   
EndFunc
[/cut]
Кнопки те же.
Небольшой фикс для работы с цветом курсора и возможность переключаться между 5-ю темами.

Добавлено: Пн дек 16, 2024 00:14
Orion9
Придумал наконец-то, что можно повесить на правый клик у кнопки Autorun внизу окна.
Изображение
Прав был jensoto - иногда нужно увидеть)
[cut]

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

RegisterCommand 77001 "AutorunEnvars" 1
RegisterCommand 77002 "AutorunEnvars" 2
RegisterCommand 77003 "AutorunEnvars" 3

ControlSetMouseAction /R /B:7 17 AutorunMenu 0
ControlSetMouseAction /L /B:7 17 AutorunStatus 0
ControlSetMouseAction /L /K:C /B:7 17 AutorunStatus 1

Func AutorunMenu(lParam)
    AutorunModules
    ModuleMenu
EndFunc

Func AutorunEnvars(lParam, wParam)
   Local Vars = (wParam = 2 ? GetState("envvars") : GetState("vars"))
   If wParam < 3 Then 
      ClipPut(Vars)
   Else
      ClipPut(StrReplace(GetState("libs"), auLF & auCR, auCRLF)) 
   EndIf    
   h = WinFind(0, "AkelPad4")
   If h > 0 Then
      ShellExec /SW_SHOWNORMAL %AKELP% '/Command(4101) /Command(4155) /Call("Scripts::Main", 1, "GoHome.vbs")'
   Else 
      ShellExec /SW_SHOWNORMAL %AKELP% '/Command(4155) /Call("Scripts::Main", 1, "GoHome.vbs")'
   Endif        
EndFunc

Func AutorunStatus(lParam)

    Local vars, h = 0
    Local dbgv = SysIntDir & "Dbgview.exe"
    Static t = 0, t1

    vars = (lParam = 1 ? GetState("envvars") : GetState("vars"))
       
    t = t + 1
    # второй вызов функции менее, 
    # чем за 300 млс. (второй клик)
    If t > 1 And (GetUptime() - t1) < 300 Then
       t = 0
       If Not WinFind(0, "dbgviewClass") Then
          If Not FileExist(dbgv) Then
             ShowHint("Файл не найден " & dbgv)
             Return   
          Endif           
          ShellExec /SW_SHOWNORMAL %dbgv%
          Sleep(100)
       Endif   
       For i = 1 To 3
          If WinFind(0, "dbgviewClass") Then
             OutputDebugString(vars)
             break
          Endif   
          Sleep(150)
       Next       
       Return
    Endif

    h = WinFind(0, "dbgviewClass")
    If h > 0 Then
       OutputDebugString(vars)
       WinSetState(23, h)
    Else 
       ShowHint("Просмотрщик DebugView не запущен")
       # Sleep(500)
       # WinSetState(23)
    Endif
    # первый клик (вызов функции)
    t1 = GetUptime()   
 
EndFunc

ControlSetHint /F /D:50 /B:7 17 "AutorunHints"
 
Func AutorunHints()
   
   Local A_Version, A_Copyright, A_DateTime, A_Wdx = AUTORUN_PATH & "\Autorun.wdx", txt
   
   If IsPressed (0x10) Then Return GetState("libs")
   If IsPressed (0x11) Then 
      txt = GetState("procs")
      If StrLen(txt) > 0 Then txt = auCRLF & txt
      Return GetState("threads") & txt
   Endif   
   If IsPressed (0x12) Then Return GetState("paths") 
   
   A_Version   = FileGetVersion(A_Wdx, "FileVersion")
   A_Copyright = FileGetVersion(A_Wdx, "LegalCopyright")
   
   obj = Plugin("FileDateTime")
   If ERROR = 0 Then
      obj.FileName = A_Wdx
      A_DateTime = StrFormat("%.0f", obj.GetValue(3))
      Free(obj)
   Else
      A_DateTime = "Error " & ERROR
   Endif

   Return "Версия: " & A_Version & auCR & "Дата изменения: " & A_DateTime & auCR & "Авторские права: " & A_Copyright 

EndFunc

Global aModuleName = List()

RegisterCommand 77010 "ModuleMenuItem" 0
RegisterCommand 77011 "ModuleMenuItem" 1
RegisterCommand 77012 "ModuleMenuItem" 2
RegisterCommand 77013 "ModuleMenuItem" 3
RegisterCommand 77014 "ModuleMenuItem" 4
RegisterCommand 77015 "ModuleMenuItem" 5
RegisterCommand 77016 "ModuleMenuItem" 6
RegisterCommand 77017 "ModuleMenuItem" 7
RegisterCommand 77018 "ModuleMenuItem" 8
RegisterCommand 77019 "ModuleMenuItem" 9

RegisterCommand 77020 "ModuleMenuItem" 10
RegisterCommand 77021 "ModuleMenuItem" 11
RegisterCommand 77022 "ModuleMenuItem" 12
RegisterCommand 77023 "ModuleMenuItem" 13
RegisterCommand 77024 "ModuleMenuItem" 14
RegisterCommand 77025 "ModuleMenuItem" 15
RegisterCommand 77026 "ModuleMenuItem" 16
RegisterCommand 77027 "ModuleMenuItem" 17
RegisterCommand 77028 "ModuleMenuItem" 18
RegisterCommand 77029 "ModuleMenuItem" 19

Func AutorunModules()

   Local p = GetState("paths"), j = 1, s
   
   aModuleName.Count = 0
   
   while 1 
      s = StrPart(p, auCRLF, j)      
      if ERROR = 1 then break
      If StrPos(s , '#') And StrRight(s, 3) ="cfg" Then
         s = StrPart(StrTrim(s), ": ", 2)
         aModuleName.Add(s)
      Endif 
      j += 1
   wend

EndFunc

Func CreateModuleMenu()
Local i, txt, obj, lWdx = true, lines, sErr, name
   
   obj = Plugin("LineBreakInfo.wdx")
   If ERROR > 0 Then
      lWdx = false
      sErr = "ERROR #" & ERROR
   Endif

   For i = 0 To aModuleName.Count - 1
      If lWdx Then
         obj.FileName = aModuleName[i]
         lines = obj.GetValue(5)
      Else
         lines = sErr
      EndIf
      name = StrTrim(StrRight(aModuleName[i], StrLen(aModuleName[i])-StrPos(aModuleName[i], "\", -1)))
      #txt = txt & 'MENUITEM "' & StrReplace(aModuleName[i], %COMMANDER_PATH%, "") & '\t' & lines & '", 770' & 10+i & auCRLF
      txt = txt & 'MENUITEM "' & name & '\t' & lines & '", 770' & 10+i & auCRLF
      
   Next
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF
   txt = txt & 'MENUITEM "Переменные окружения", 77002' & auCRLF
   txt = txt & 'MENUITEM "Глобальные переменные", 77001' & auCRLF
   txt = txt & 'MENUITEM "Информация о библиотеках", 77003' & auCRLF      
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF
#   txt = txt & 'MENUITEM "Справка...", 77000' & auCRLF      
   txt = txt & 'MENUITEM "Настройки...", 77000' & auCRLF   
   
   If lWdx Then Free(obj)   

   Return txt

EndFunc   

Func ModuleMenu()
   ShowPopupMenu /D /F "CreateModuleMenu"       
EndFunc     

Func ModuleMenuItem(lParam, nItem)

   Local file, b_Ctrl = IsPressed(0x11)

   If aModuleName.Count = 0 Then 
      ShowHint("Массив не содержит элементов")
      Return
   EndIf   
   
   If nItem < 0 Or nItem > aModuleName.Count  Then 
      ShowHint("Выход за границы массива")
      Return
   EndIf      

    file = aModuleName[nItem]
    
    If b_Ctrl Then
       CommandExec /CD:S %file%
    Else   
       ShellExec /SW_SHOWNORMAL %AKELP% ' %file%'
    EndIf
    
EndFunc     
[/cut]
А вот вам и хЫшный коммандер :lol:
Изображение
Ну и смена фона:
Изображение

[cut="Backdrop.aucfg"]

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

# Ctrl+Shift+"+" 		- 	Повышение тонов
# Ctrl+Shift+"-" 		- 	Понижение тонов
# Ctrl+"+" 			- 	Автоповышение тонов
# Ctrl+"-" 			- 	Автопонижение тонов
# ESC 				- 	Выход из автоперебора
# Alt+"+" 			- 	Показ текущих значений фона
# Alt+"-" 			- 	Показ текущих значений схемы
# Alt+Shift+"+" 		- 	Повышение одного тона
# Alt+Shift+"-" 		- 	Понижение одного тона
# Alt+Win+Click			-	Переключение цветовой схемы
# Alt+Click (Активная)		-	Переключение сохраненного фона
# Alt+Click (Неактивная)	-	Переключение предопределенного фона
# Alt+Shift+Click (Активная)	-	Переключение сохраненного фона (реверс)

Pragma IncludeOnce

Global Pulsar = 0, PulsarDelay = 50, BACKDROP_THREAD = 0, BackColor1 = 0, BackColor2 = 0, Previous1 = 0, Previous2 = 0

Global CF_NAME = "", CF_VALUE = -1, CF_KEY = 0, CF_COLOR_KEY = 0, WRITE_COLOR_MODE = 0, CL_KEY = "", CL_VALUE = -1, CL_SNAP = ""

Global CL_MousePosX = 0, CL_MousePosY = 0, TEST_HINT = 0

# задержка автоперебора
IniRead /R PulsarDelay %COMMANDER_INI% "Autorun" "PulsarDelay" 50

# панель для сохранения фона
Global CL_BAR = %COMMANDER_PATH% & "\Bars\Backdrops.bar"
# путь к редактору
Global CL_AKEL4 = %COMMANDER_PATH% & "\Utilites\AkelPad\AkelPad.exe", CL_TCFS2 = ""

# путь к TCFS2 для отправки сообщений
Set /EV- CL_TCFS2 "%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe"

# повышение/понижение тонов
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

# повышение/понижение одного тона
SetHotkeyAction /K:A /K:S /V:187 /R /DM SetBackGround 1 1
SetHotkeyAction /K:A /K:S /V:189 /R /DM SetBackGround 2 1

# показать текущие значения
SetHotkeyAction /K:A /V:187 ShowBackColor 1000
SetHotkeyAction /K:A /V:189 SwitchColors 0

# 70000-700100

# первоначальные значения секции
# 0 - запомнить 
# 1 - открыть в редакторе
RegisterCommand 70000 "InitialColors" 1

# регистрация команды для вызова из кнопки (пункта меню)
RegisterCommand 70001 "AutoBackdrop"

# запоминание текущего фона
RegisterCommand 70002 "BackColorBar"

# создание и отображение меню
RegisterCommand 70003 "ShowBackdropMenu"

# ключи секции [Color]
RegisterCommand 70004 "ColorItem" "Backdrop"
RegisterCommand 70005 "ColorItem" "MarkColor"
RegisterCommand 70006 "ColorItem" "CursorColor"
RegisterCommand 70007 "ColorItem" "ForeColor"
RegisterCommand 70008 "ColorItem" "CursorText"
RegisterCommand 70009 "ColorItem" "BackColor"
RegisterCommand 70010 "ColorItem" "BackColor2"

# ключи ColorFilter секции [Color]
RegisterCommand 70011 "ColorFilterItem" 1
RegisterCommand 70012 "ColorFilterItem" 2
RegisterCommand 70013 "ColorFilterItem" 3
RegisterCommand 70014 "ColorFilterItem" 4
RegisterCommand 70015 "ColorFilterItem" 5
RegisterCommand 70016 "ColorFilterItem" 6
RegisterCommand 70017 "ColorFilterItem" 7
RegisterCommand 70018 "ColorFilterItem" 8
RegisterCommand 70019 "ColorFilterItem" 9
RegisterCommand 70020 "ColorFilterItem" 10
RegisterCommand 70021 "ColorFilterItem" 11
RegisterCommand 70022 "ColorFilterItem" 12
RegisterCommand 70023 "ColorFilterItem" 13
RegisterCommand 70024 "ColorFilterItem" 14
RegisterCommand 70025 "ColorFilterItem" 15
RegisterCommand 70026 "ColorFilterItem" 16
RegisterCommand 70027 "ColorFilterItem" 17
RegisterCommand 70028 "ColorFilterItem" 18
RegisterCommand 70029 "ColorFilterItem" 19
RegisterCommand 70030 "ColorFilterItem" 20
RegisterCommand 70031 "ColorFilterItem" 21
RegisterCommand 70032 "ColorFilterItem" 22
RegisterCommand 70033 "ColorFilterItem" 23
RegisterCommand 70034 "ColorFilterItem" 24
RegisterCommand 70035 "ColorFilterItem" 25
RegisterCommand 70036 "ColorFilterItem" 26
RegisterCommand 70037 "ColorFilterItem" 27
RegisterCommand 70038 "ColorFilterItem" 28
RegisterCommand 70039 "ColorFilterItem" 29
RegisterCommand 70040 "ColorFilterItem" 30

# управление потоком
RegisterCommand 70050 "BackdropAction" 0

# прием сообщения окну "установить значения фона"
SetMessageAction /P "BackColorsMessage" SetBackColors

# значения фона при старте ТС
If BackColor1 = 0 or BackColor2 = 0 Then
   IniRead /R BackColor1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R BackColor2 %COMMANDER_INI% "Colors" "BackColor2" -1
Endif

Func BackdropAction(lParam, lAction)
   BACKDROP_THREAD = lAction
EndFunc

Func InitialColors(lParam, lMode)
Local i = 0, cf, txt

   If lMode = 1 Then
      # вызов пункта меню для показа значений
      OpenInTextEditor(CL_SNAP)
      Return 
   Endif
   
   # снимок первоначальных значений 
   CL_SNAP = ";значения секции при запуске ТС" & auCRLF
   CL_SNAP = CL_SNAP & "[Colors]" & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "ForeColor" -1   
   CL_SNAP = CL_SNAP & "ForeColor=" & txt & auCRLF   
   
   IniRead /R txt %COMMANDER_INI% "Colors" "BackColor" -1
   CL_SNAP = CL_SNAP & "BackColor=" & txt & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "BackColor2" -1   
   CL_SNAP = CL_SNAP & "BackColor2=" & txt & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "MarkColor" -1   
   CL_SNAP = CL_SNAP & "MarkColor=" & txt & auCRLF
   
   IniRead /R txt %COMMANDER_INI% "Colors" "CursorColor" -1   
   CL_SNAP = CL_SNAP & "CursorColor=" & txt & auCRLF
  
   IniRead /R txt %COMMANDER_INI% "Colors" "CursorText" -1   
   CL_SNAP = CL_SNAP & "CursorText=" & txt & auCRLF            

   While i < 100
   
      i = i + 1
   
      IniRead /R cf %COMMANDER_INI% "Colors" %"'ColorFilter' & %i%" "stop"
      If cf="stop" Then Break
      
      IniRead /R txt %COMMANDER_INI% "Colors" %"'ColorFilter' & %i% & 'Color'"
      CL_SNAP = CL_SNAP & cf & "=" & txt & auCRLF            
               
   Wend
   
EndFunc
  
Func AutoBackdrop(lParam)
Static StartCount = 0

   # удержание Win
   # тестирование фона подсказки
   If BACKDROP_THREAD = 0 And IsPressed (0x5B) Then TEST_HINT = 1

   # удержание Ctrl+Shift
   # повышение тона на одну единицу при нажатии
   # на кнопку, выборе пункта меню или вызове другим способом
   If IsPressed (0x10) And IsPressed (0x11) Then Return SetBackGround(1)
   
   # удержание Ctrl
   # понижение тона на одну единицу
   If IsPressed (0x11) Then Return SetBackGround(2)
   
   # удержание Alt+Win
   # вернуть предыдущий фон
   If IsPressed (0x12) And IsPressed (0x5B) Then
      If Previous1 > 0 or Previous2 > 0 Then WriteBackground(Previous1, Previous2)
      Return 
   Endif
   
   # удержание Alt+Shift
   # скопировать в буфер код кнопки текущего фона  
   If IsPressed (0x12) And IsPressed (0x10) Then
      IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
      IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
      ClipPut("TOTALCMD#BAR#DATA" & auCRLF & CL_TCFS2 & auCRLF & _
              "/u- /ef ""msg(regmsg(BackColorsMessage), " & bkg1 & ", " & bkg2 & ")""" & auCRLF & "%COMMANDER_EXE%")
      ShowBackHint("Кнопка с фоном скопирована")
      Return
   Endif
   
   # удержание Alt
   # вернуть первоначальный фон TC
   If IsPressed (0x12) Then Return WriteBackground(BackColor1, BackColor2)
   
   # удержание Shift
   # показ текущих значений фона
   If IsPressed (0x10) Then Return ShowBackColor()   
   
   # поток уже запущен
   If BACKDROP_THREAD > 0 Then
      If TEST_HINT = 1 Then
         ShowHint("Режим TEST_HINT выключен")
         TEST_HINT = 0
         Sleep(700)         
         BACKDROP_THREAD = 0
         Return
      Endif
      ShowPopupMenu /D /F "CreateBackdropMenu"
   Else
      tc = ProcessCount("TOTALCMD.EXE") + ProcessCount("TOTALCMD64.EXE")
      If tc > 1 Then
         ShowHint("Запущено " & tc & " процесса Total Commander" & auLF & _
                  "Для корректной работы требуется только одна копия TOTALCMD")
         Return
      EndIf
      If StartCount = 0 Then InitialColors(0, 0)
      BACKDROP_THREAD = 1
      If TEST_HINT Then 
         CF_NAME = "HINT TEST MODE" 
      Else
         # при старте парное значение фона по умолчанию
         ColorItem(1, "Backdrop")      
      Endif        
      RunThread ThreadBackdrop
      StartCount = StartCount + 1
      SetHintParam("ShowHint", "Font", 10, "Tahoma")
      SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
      SetHintParam("ShowHint", "Text", 0xFFFFFF)
      #SetHintParam("ShowHint", "Frame", 0xFFFFFF)       
      ShowHint("Отслеживание запущено." & auLF & _
               "Действия в окне ColorMania:" & auLF & auLF & _
               "CTRL - Применение цвета" & auLF & _
               "SHIFT - откат, ALT - умолчание" & auLF  & _               
               "ESC - синхронизация, WIN - буфер")  
      Sleep(2000)
      #WinSetState(23)
      SetHintParam("ShowHint", "Reload")      
   Endif
   		
EndFunc

# прием сообщения
Func SetBackColors(hWnd, uMsg, wParam, lParam)
     WriteBackground(wParam, lParam) 
EndFunc

# запись парных значений
Func WriteBackground(Color1, Color2)
     IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %Color1%
     IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %Color2%
     # обновление панелей
     SendCommand 2957
     SendCommand 2957
EndFunc

# запись одиночных значений
Func WriteSingleColor(KeyName, KeyValue)
     IniWrite /R %COMMANDER_INI% "Colors" %"%KeyName%" %KeyValue%
     SendCommand 2957
     SendCommand 2957
EndFunc

# режим тестирования подсказки
Func TestHintParam(ParamName, ParamValue, handle)
Local blue, green, red

    blue = floor(ParamValue/65536)
    green = ParamValue - (blue * 65536)
    green = floor(green/256)
    red = ParamValue - (blue * 65536) - (green * 256)
    
    SetHintParam("ShowHint", ParamName, 1*blue + 256*green + 65536*red)
    #SetHintParam("ShowHint", "Text", 0xFFFFFF)
    
    ShowHint("Test text" & auCRLF & "Hex " & Hex(ParamValue, 6) & auCRLF & "Dec " & ParamValue & auLF & _
             "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue)
    Sleep(100)
    SetHintParam("ShowHint", "Reload")
    WinSetState(23, handle)
EndFunc

# функция работает в отдельном потоке
Func ThreadBackdrop()
Local h = 0, r, g, b, c, max = 1*255 + 256*255 + 65536*255, clip, last = -1, w = 0, v = 0, action, state

   # предыдущие значения фона
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
   
   While BACKDROP_THREAD = 1

       # поиск окна Color Dialog Box
       h = WinFind(0, "#32770", "Цвет")
       If h > 0 Then
          action = "Color Dialog Box  > "
          If WinGetState(4, h) Then 
             action = action & "Active  > "
             r = WinGetText(WinFind(h, "Edit", 4))
             g = WinGetText(WinFind(h, "Edit", 5))
             b = WinGetText(WinFind(h, "Edit", 6))
             # непустые поля редактирования
             If Not (StrLen(r) = 0 And StrLen(g) = 0) Then
                c = 1*r + 256*g + 65536*b             
                action = action & "Ready to apply RGB: " & r & ", " & g & ", " & b
             Else
                action = action & "RGB Unreachable"    
             EndIf       
          Endif    
       Else    
          # поиск окна ColorMania
          h = WinFind(0, "TfrmColorPick")       
          If h > 0 Then
             action = "ColorMania  > "
             If WinGetState(4, h) Then 
                action = action & "Active  > "
                c = WinGetText(WinFind(h, "TEdit", 1))
                action = action & "Ready to apply value: " & c
             Endif    
          EndIf        
       EndIf      
                 
       If h > 0 And WinGetState(4, h) > 0 Then
          If IsPressed (0x11) Then       
             # удержание CTRL 
             # значение активного окна
             If StrLen(c) > 0 Then
                clip = c
                action = "Applying " & clip
             Endif            
          ElseIf IsPressed (0x12) Then
             # удержание ALT       
             # значение по умолчанию
             clip = "-1"
             action = "Applying -1"
          ElseIf IsPressed (0x10) Then
             # удержание SHIFT            
             # предыдущее значение
             clip = CL_VALUE
             action = "Undo " & clip             
          ElseIf IsPressed (0x5B) Then
             # удержание WIN              
             # первая строка в буфере 
             clip = StrPart(ClipGet(), auLF, 1)
             action = "Clipboard " & clip           
          ElseIf IsPressed (0x1B) Then
             # удержание ESC
             # синхронизация цвета в окне 
             # с изначальным цветом элемента       
             ColorSync(CL_VALUE)
             action = "Color Sync " & clip 
          Endif
          If CL_KEY = 'CursorColor' Or CL_KEY = 'CursorText' Then 
             If IsPressed (0x11) Or IsPressed (0x12)  Or IsPressed (0x10) Or IsPressed (0x5B) Then WinSetState(23)
          EndIf   

       ElseIf h > 0 And WinGetState(4, h) = 0 Then
          action = action & "Not Active"
       Else       
          action = "Waiting for a window..."
       Endif
          
       If IsInt(clip) Then
          # новое число в диапазоне
          If clip >= -1 And clip <= max And Not (clip = last) Then
              
             If TEST_HINT = 1 Then 
                CF_NAME = "HINT TEST MODE"
                WRITE_COLOR_MODE = 3
             EndIf   
                       
             If WRITE_COLOR_MODE = 0 Then
                WriteBackground(clip, clip)
                w = w + 1
             ElseIf WRITE_COLOR_MODE = 1 Then
                WriteSingleColor(CL_KEY, clip)
                v = v + 1
             Else
                TestHintParam('BackColor', clip, h)
                v = v + 1                                
             Endif
             last = clip
             Sleep(100)
          Endif
       Endif
       
       Sleep(250)
       WinSetText("Changing colors  > " & CF_NAME & "  > " & action  )
       
   Wend
   BACKDROP_THREAD = 0
   WinSetText("")
   WinRedraw
   
   SetHintParam("ShowHint", "Font", 10, "Tahoma")
   SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
   SetHintParam("ShowHint", "Text", 0xFFFFFF)
   
   ShowHint("Отслеживание остановлено" & auLF & _
            "Применений фона: " & w & auLF & _
            "Применение других значений: " & v)
            
   Sleep(2000)
   WinSetState(23)
   SetHintParam("ShowHint", "Reload")   
EndFunc

Func SetBackGround(nParam, nZebra = 0)
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 Not IsInt(bkg1) Or Not IsInt(bkg2) Then
      MsgBox("Нечисловые значения цвета фона: " & auLF & auLF & _
              "BackColor=" & bkg1 & auLF & "BackColor2=" & bkg2 & auLF & auLF & _
              "ESC - Отмена операции")
      Return
   Endif
   
   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
   
   If nZebra Then
      WriteSingleColor("BackColor2", bkg2)
   Else
      WriteBackground(bkg1, bkg2)
   Endif
   
EndFunc

Func SetPulsar(nParam)
local a, b, s, l
static t = 0
   
   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
   
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
  
   While Pulsar = 1
   
      For j = a To b step s
      
         For i = 1 To 75
             
             SetBackGround(j)
             # значение можно увеличить
             # если мерцает только одна панель
             Sleep(PulsarDelay)
             l = l + 1
             t = t + 1
             
             If Pulsar = 0 Then Break
             
             If IsPressed (0x1B) Then
                Pulsar = 0
                Break
             Endif
             
         Next
         
         If Pulsar = 0 Then Break
      Next
      
   Wend
   # выход по ESC
   # показать статистику
   If IsPressed (0x1B) Then
      ShowHint("Изменений тонов: " & l & auCRLF & "Всего изменений: " & t)
   Endif    
EndFunc 

Func ShowBackColor(lDelay = 300)
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

Func BackColorBar(lParam)
Local i, bkg1, bkg2, bar = CL_BAR
       
   If Not FileExist(bar) Then   
      MsgBox("Файл не существует " & bar, "Backdrop")
      Return
   Endif
   
   IniRead i %bar% "Buttonbar" "Buttoncount" 0
   
   If Not IsInt(i) or i < 1 Then
      MsgBox("Ошибка Buttoncount < 1 " & auCRLF & bar, "Backdrop")
      Return
   Endif
   
   IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1   
   
   i = i + 1
  
   IniWrite /EV- %bar% "Buttonbar" %"'Button' & %i%" "%COMMANDER_EXE%"
   IniWrite %bar% "Buttonbar" %"'Cmd' & %i%"    "%CL_TCFS2%"
   IniWrite %bar% "Buttonbar" %"'Param' & %i%"  '"/u- /ef "msg(regmsg(BackColorsMessage), %bkg1%, %bkg2%)"'      
   IniWrite %bar% "Buttonbar" %"'Menu' & %i%"   "Фон %bkg1%, %bkg2%"   
          
   IniWrite %bar% "Buttonbar" "Buttoncount" %i%
   
   ShowBackHint("Фон панелей сохранен")
   
EndFunc

Func ShowBackHint(BackHint, PosX = false)

   SetHintParam("ShowHint", "Font", 10, "Arial")
   SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
   SetHintParam("ShowHint", "Text", 0xFFFFFF)
   
   If PosX Then
      ShowHint(BackHint, CL_MousePosX, CL_MousePosY)   
   Else
      ShowHint(BackHint)
   Endif
   
   Sleep(1000)
   WinSetState(23)
   
   SetHintParam("ShowHint", "Reload")
   
EndFunc

Func CreateBackdropMenu()
Local i = 0, cf, txt

   txt = txt & 'MENUITEM "Остановить отслеживание", 70050' & auCRLF
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF
   txt = txt & 'MENUITEM "Фон\tBackground", 70004' & auCRLF   
   txt = txt & 'MENUITEM "Выделение\tMarkColor", 70005' & auCRLF
   txt = txt & 'MENUITEM "Курсор\tCursorColor", 70006' & auCRLF
   txt = txt & 'MENUITEM "Текст\tForeColor", 70007' & auCRLF
   txt = txt & 'MENUITEM "Текст под курсором\tCursorText", 70008' & auCRLF
   txt = txt & 'MENUITEM "Фон 1\tBackColor", 70009' & auCRLF
   txt = txt & 'MENUITEM "Фон 2\tBackColor2", 70010' & auCRLF
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF   

   While i < 100
   
      i = i + 1
      # перебор ключей ColorFilterN
      IniRead /R cf %COMMANDER_INI% "Colors" %"'ColorFilter' & %i%" "stop"
      If cf="stop" Then Break
                       
      txt = txt & 'MENUITEM "' & cf & '", 700' & 10+i & auCRLF
      
   Wend
   
   txt = txt & 'MENUITEM SEPARATOR' & auCRLF 
   If BACKDROP_THREAD > 0 Then
      txt = txt & 'MENUITEM "Текущий элемент - ' & CF_NAME & '", 70050'  & auCRLF
   EndIf
   txt = txt & 'MENUITEM "Первоначальные значения секции [Colors]", 70000'
   
   Return txt
EndFunc

Func ShowBackdropMenu(lParam)
    
    # вызов с Shift
    # копировать значение -1 в буфер
    If IsPressed(0x10) Then 
       SetDefaultColor
       Return
    EndIf
    
    # координаты кнопки вызова меню
    MouseGetPos("CL_MousePosX", "CL_MousePosY")
    ShowPopupMenu /D /F "CreateBackdropMenu"
    
EndFunc

Func ColorFilterItem(lParam, wItem)

    Local key1, key2, val1, val2
    
    If BACKDROP_THREAD = 0 Then
       ShowHint("Отслеживание цвета не запущено")
       Return
    Endif

    key1 = "ColorFilter" & wItem
    key2 = key1 & "Color"
    
    IniRead /R val1 %COMMANDER_INI% "Colors" %"%key1%" ""
    IniRead /R val2 %COMMANDER_INI% "Colors" %"%key2%" ""
    
    # формат "ColorFilter1"
    CF_KEY = key1
    # формат "ColorFilter1Color"
    CF_COLOR_KEY = key2
    # формат "Имя фильтра", например "Autorun"    
    CF_NAME = val1
    # формат "Цвет фильтра", например "65535"
    CF_VALUE = val2

    # глобальные значения для потока    
    CL_KEY = CF_COLOR_KEY
    CL_VALUE = CF_VALUE

    # режим записи "Одиночный ключ"      
    WRITE_COLOR_MODE = 1

    ColorItemChange(CL_VALUE)    
    ShowBackHint("Цвет типа выбран" & auCR & "Значения будут применятся к " & CF_NAME, false)
    
EndFunc

Func ColorItem(lParam, sItem)
Local key, val

    If BACKDROP_THREAD = 0 Then
       ShowHint("Отслеживание цвета не запущено")
       Return
    Endif
    
    # парный однотонный фон BackColor = BackColor2
    If sItem = "Backdrop" Then
       # режим записи "Парный ключ"       
       WRITE_COLOR_MODE = 0
       # Имя для потока
       CF_NAME = "Background"
       IniRead /R val %COMMANDER_INI% "Colors" "BackColor" -1
       # значение цвета
       CL_VALUE = val
       ColorItemChange(CL_VALUE)       
       # запуск из меню
       If lParam = 0 Then
          ShowBackHint("Цвет типа выбран" & auCR & "Значения будут применятся к " & CF_NAME)                     
       Endif
       Return      
    Endif
    
    key = sItem
    IniRead /R val %COMMANDER_INI% "Colors" %"%key%" ""

    # глобальные значения для потока        
    CL_KEY = key
    CL_VALUE = val
    CF_NAME = key
    WRITE_COLOR_MODE = 1

    ColorItemChange(CL_VALUE)
    ShowBackHint("Цвет типа выбран" & auCR & "Значения будут применятся к " & CF_NAME, false)
    
EndFunc

# смена элемента
Func ColorItemChange(ColorText)
    # очистка буфера
    ClipPut(ColorText) 
    # синхронизация цвета 
    # ColorSync(ColorText)
EndFunc

Func ColorSync(ColorText)
    Local h = WinFind(0, "TfrmColorPick")
    
    If h > 0 Then
        # синхронизация цвета с окном ColorMania 
        WinSetText(ColorText, WinFind(h, "TEdit", 1))
        b = WinFind(h, "TButton", 2)
        SendMessage(b, 0xF5, 0, 0)
    Endif    
EndFunc

Func OpenInTextEditor(Text)
Local h = 0

    ClipPut(Text)
    
    h = WinFind(0, "AkelPad4")
    If h > 0 Then
       ShellExec /SW_SHOWNORMAL %CL_AKEL4% '/Command(4101) /Command(4155)'
       Return
    Endif
    
    If Not FileExist(CL_AKEL4) Then 
       ShowHint("AkelPad не найден " & CL_AKEL4 & "Текст значений скопирован в буфер.")
    Else
       ShellExec /SW_SHOWNORMAL %CL_AKEL4% ' /Command(4155)'       
    Endif 
    
EndFunc

Func SetDefaultColor()
   If BACKDROP_THREAD > 0 Then
      ClipPut("-1")
      ShowBackHint("Установлен цвет по-умолчанию для " & CF_NAME)
   Else
      ShowHint("Отслеживание цвета не запущено")
   Endif   
EndFunc

# массивы значений из бар-файла 
Global aBarList  = List(), _
       aBarList2 = List()
       
# массивы предопределенных значений
# последний элемент используется для записи начального фона
Global aBackList  = List(7566195, 7497811, 9865603, 8421230, -1)
Global aBackList2 = List(7566195, 7497811, 9865603, 8421230, -1)

# Alt+Click активная панель
# использовать бар-файл для переключения фона
ControlSetMouseAction /L /K:A 3 SetColorNum 1
ControlSetMouseAction /L /K:S /K:A 3 SetColorNum 1

# Alt+Click неактивная панель
# использовать встроенный массив для переключения фона
ControlSetMouseAction /L /K:A 4 SetColorNum 2

# регистрация команды
# вызов из кнопки или пункта меню
RegisterCommand 70040 "SetColorNum"

Func SetColorNum(lParam)
Local bkg1, bkg2, blue, green, red, txt, i = 1

   # удержание Win (клик по файловой панели + Alt)
   # смена цветовой схемы
   If lParam = 1 And IsPressed(0x5B) Then
      SwitchColors(1)
      Return
   EndIf
   
   # удержание Shift
   # переключение в обратном направлении
   If IsPressed(0x10) Then i = -1  

   # удержание Win (вызов из кнопки)
   # запуск автоперебора
   If lParam = 0 And IsPressed(0x5B) Then 
      If IsPressed(0x12) Then 
         SetPulsar 1
         Return
      ElseIf IsPressed(0x11) Then
         SetPulsar 2
         Return
      Endif   
   EndIf
   
   # удержание Alt (вызов из кнопки)
   # параметры задержки
   If lParam = 0 And IsPressed(0x12) Then 
      If IsPressed(0x10) Then 
         SetPulsarDelay -10
      Else
         SetPulsarDelay +10
      Endif   
      Return
   EndIf

   # массивы переключения цвета фона 
   Local aColorsList, aColorsList2
   # индекс цвета в массиве
   Static ColorIndex = -1

   # массив из бар-файла (по умолчанию)
   If lParam = 0 Then lParam = 1
   
   # удержание Ctrl
   # использовать резевный массив 
   If IsPressed(0x11) Then lParam = 2
   
   # удержание Win
   # принудительное чтение бар-файла
   If lParam = 1 And IsPressed(0x5B) Then aBarList.Count = 0

   # инициализация массива из бар-файла
   If lParam = 1 And aBarList.Count = 0 Then
      If Not LoadColorBar() Then
         Sleep(1000)
         WinSetState(23)
         Return
      EndIf  
   EndIf
   
   # добавление начального фона к резерву
   aBackList[aBackList.Count-1] = BackColor1
   aBackList2[aBackList2.Count-1] = BackColor2   
   
   If lParam = 1 Then
      aColorsList  = aBarList
      aColorsList2 = aBarList2     
   Else 
      aColorsList  = aBackList
      aColorsList2 = aBackList2      
   EndIf
   
   ColorIndex = ColorIndex + i
   If ColorIndex > aColorsList.Count - 1 Then ColorIndex = 0
   If ColorIndex < 0 Then ColorIndex = aColorsList.Count - 1
   
   bkg1 = aColorsList[ColorIndex]
   bkg2 = aColorsList2[ColorIndex]   
   
   WriteBackground(bkg1, bkg2)
   
   txt = "Фон " & ColorIndex + 1 & " из " &  aColorsList.Count & auLF & "Значение: " & bkg1
   
   If bkg1 = -1 Then bkg1 = 1*255 + 256*255 + 65536*255
   
   blue = floor(bkg1/65536)
   green = bkg1 - (blue * 65536)
   green = floor(green/256)
   red = bkg1 - (blue * 65536) - (green * 256)
   
   txt = txt & auLF & "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue   
   
   ShowHint(txt)

EndFunc

Func LoadColorBar()
Local i, b, b2, p, c, bar = CL_BAR, max = 1*255 + 256*255 + 65536*255
       
   If Not FileExist(bar) Then   
      ShowHint("Панель не существует: " & bar)
      Return 0
   Endif
   
   IniRead c %bar% "Buttonbar" "Buttoncount" -1
   
   If c = -1 Or IsInt(c) = false Then
      ShowHint("Панель повреждена: " & bar)
      Return 0    
   EndIf
   
   If c < 1 Then
      ShowHint("Количество кнопок < 1  " & bar)
      Return 0
   Endif

   # очистка от старых значений   
   aBarList.Count = 0
   aBarList2.Count = 0   
   
   For i = 1 To c
      # перебор ключей ParamN
      IniRead p %bar% "Buttonbar" %"'Param' & %i%" ""
      # маркер не найден      
      If Not StrPos(p, "BackColorsMessage") Then Continue
      # маркер найден: значение ключа ParamN  
      b =  StrTrim(StrPart(p, ",", 2))
      b2 = StrTrim(StrPart(p, ",", 3))
      b2 = StrPart(b2, ")", 1)     
      # корректное значение сохраненного фона
      If IsInt(b) And b >= 0 and b <= max Then
         aBarList.Add(b)
         # корректное значение второго фона         
         If IsInt(b2) And b2 >= 0 and b2 <= max Then
            aBarList2.Add(b2)
         Else 
            # некорректное значение второго фона                  
            aBarList2.Add(b)         
         EndIf    
      EndIf  
   Next

    # перебор не дал результата   
    If aBarList.Count = 0 Then
       ShowHint("Панель не содержит значений фона  " & auCRLF & bar)
       Return 0
    Endif    

   # значения найдены
   # добавление начального фона к массивам  
   aBarList.Add(BackColor1)
   aBarList2.Add(BackColor2)   

   Return 1       
   
EndFunc

Func SetPulsarDelay(lParam)

   PulsarDelay += lParam
   
   If PulsarDelay > 200 Then PulsarDelay = 20
   If PulsarDelay < 20 Then PulsarDelay = 200
   
   IniWrite /R %COMMANDER_INI% "Autorun" "PulsarDelay" %PulsarDelay%
   
   ShowHint("Задержка автоперебора: " & PulsarDelay)
   Sleep(1000)
   WinSetState(23)
   
EndFunc

# переключение цветовой схемы 
RegisterCommand 70051 "SwitchColors"

Func SwitchColors(lParam)
Local n = "Colors", f, p = %COMMANDER_PATH% & "\Ini\", _
      num, theme, desc
      
   # счетчик номеров      
   Local c = 0

   # оригинальный файл Colors.ini
   f = p & n & ".ini"
       
   IniRead num %f% "ColorTheme" "Instance" 0  
   IniRead desc %f% "ColorTheme" "Description" 
   IniRead theme %f% "ColorTheme" "Name" 

    # lParam 0 - вызов из кнопки
    If lParam = 0 And IsPressed (0x12) Then
       ShowHint("Тема: " & theme & auCRLF & "Описание: " & desc & auCRLF & "Номер: " & num)
       Return
    EndIf
    
   If Not IsInt(num) Then
      ShowHint("Значение Instance не является числом: " & num)
      Return
   Endif
   
   If num < 0 And num > 5 Then
      ShowHint("Значение Instance выходит за границы: " & num)
      Return
   Endif
   
   # текущий номер темы
   c = num
   If c >= 5 Then c = 0
   
   # следующий номер темы   
   c += 1
   
   # текущая -> предыдущая
   prev_theme = p & n & num & ".ini"
   # следующая по номеру тема   
   next_theme = p & n & c & ".ini"
   
   # имя файла в ТС
   tc_name = n & ".ini"
   
   prev_name = n & num & ".ini"
   next_name = n & c & ".ini"  

   If lParam = 0 And IsPressed (0x10) Then
      ShowHint(prev_theme & auCRLF & next_theme)
      Return
   EndIf   
   
   If Not FileExist(next_theme) Then
      c = 1
      If c = num Then 
         ShowHint("Не удалось переключиться на тему." & auCRLF & "Файл: " & next_theme)
         Return
      Endif
      next_theme = p & n & c & ".ini"
      If Not FileExist(next_theme) Then
         ShowHint("Не удалось переключиться на тему." & auCRLF & "Файл: " & next_theme)
         Return
      Endif      
   EndIf
   
   ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% '/c rename "%f%" %prev_name%'
   If FileExist(f) Then
      ShowHint("Не удалось переименовать " & f & " в " & prev_name)
      Return
   Endif
   
   ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% '/c rename "%next_theme%" %tc_name%'  
   If FileExist(next_theme) Then
      ShowHint("Не удалось переименовать " & next_theme & " в " & tc_name)
      Return
   Endif
   
   SendCommand 2957
   SendCommand 2957
   
   # смена начальных значений фона
   IniRead /R BackColor1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R BackColor2 %COMMANDER_INI% "Colors" "BackColor2" -1
   aBarList.Count = 0
   aBarList2.Count = 0   
   
   If lParam = 0 And IsPressed (0x11) Then lParam = 1

   # lParam 1 - вызов с указанием параметра (Alt+Win+Click на панелях)
   If lParam = 1  Then
      IniRead num %f% "ColorTheme" "Instance" 0  
      IniRead desc %f% "ColorTheme" "Description" 
      IniRead theme %f% "ColorTheme" "Name"     
      ShowHint("Тема: " & theme & auCRLF & "Описание: " & desc & auCRLF & "Номер: " & num)
   EndIf     
   
EndFunc
[/cut]