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

Добавлено: Чт ноя 14, 2024 16:34
Orion9
Loopback
Понятно. Ну, с этим жить можно, ничего страшного :)

А сложно будет реализовать такую функцию в плагине?
https://www.autohotkey.com/docs/v2/lib/DateDiff.htm
Хотелось бы увидеть в будущих версиях )

Добавлено: Чт ноя 14, 2024 19:42
Orion9
Побаловался дальше с кнопкой "Autorun":

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

ControlSetMouseAction /L /B:7 17 AutorunStatus 0
ControlSetMouseAction /R /B:7 17 AutorunStatus 1

Func AutorunStatus(lParam)
Local vars, h = 0, file, out
Static t = 0

    vars = GetState("vars")
    
    if lParam = 1 then
       ClipPut(vars)
       ShowHint("Информация скопирована в буфер")
       Sleep(100)
       h = WinFind(0, "AkelPad4")
       if h > 0 then
          ShellExec /SW_SHOWNORMAL %AKELP% "/Command(4101) /Command(4191)"
       else 
          ShellExec /SW_SHOWNORMAL %AKELP% "/Command(4191)"
       endif        
       Return
    endif

    t = t + 1
    if t > 3 then
       t = 0
       ShowHint("Правый клик: Запуск AkelPad")
       Return
    endif

    h = WinFind(0, "dbgviewClass")
    if h > 0 then
       OutputDebugString(vars)
       WinSetState(23, h)
    else 
       ShowHint("Отладчик DebugView не запущен")
       Sleep(700)
       WinSetState(23)
    endif        
EndFunc
Прикольно. Жаль только, буфер пока режет, но мне уже нравится :)

Добавлено: Чт ноя 14, 2024 22:29
Loopback
Orion9 писал(а):Хотелось бы увидеть в будущих версиях )
Есть и в настоящих:

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

sec = (ToDateTime("2024-11-14 13:25:11") - ToDateTime("2024-11-14 11:57:31")) / 10000000
MsgBox(sec)
Orion9 писал(а):Жаль только, буфер пока режет
Исправленная версия:

Runtime 14.11.2024

Также в ней уже исправлен WinGetText.

Добавлено: Чт ноя 14, 2024 23:58
Orion9
Loopback
Проверил буфер - работает. Но русские символы выводятся как ????

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

sec = (ToDateTime("2024-11-14 13:25:11") - ToDateTime("2024-11-14 11:57:31")) / 10000000
MsgBox(sec) 
Класс. :) Но DateDiff, как я понял, более продвинутая: корректно считает дни, учитывая високосные годы. Кроме того, не нужно самостоятельно делать вычисления, а лишь указать формат вывода (секунды, минуты, часы, дни).

Добавлено спустя 29 минут:
Также в ней уже исправлен WinGetText.
Вау! Подправил скрипт и ахнул - как же круто получилось! 🔥 Фон меняется буквально с ползунком! (Если ColorMania не запущена, цвет будет браться из буфера, как и прежде).

[cut]

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

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

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

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

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

SetHotkeyAction /K:A /V:187 ShowBackColor 1000

RegisterCommand 70001 "AutoBackdrop"

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

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

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

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

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

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

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

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

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

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

EndFunc

Func SetPulsar(nParam)
local a, b, s, 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
  
   While Pulsar = 1
   
      For j = a To b step s
      
         For i = 1 To 75
             
             SetBackGround(j)
             Sleep(25)
             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
   ShowHint("Изменений тонов: " & l & auCRLF & "Всего изменений: " & t)
   Sleep(1000)
   WinSetState(23)
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)
#   Sleep(1000)
 #  WinSetState(23)
EndFunc
[/cut]

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

По поводу ???? в буфере. Если копирование происходит при русской раскладке - проблемы нет. Только если язык ввода стоит En, тогда появляется проблема. Причина:
В некоторых случаях происходят ошибки при копировании текста через буфер обмена из одной программы в другую - вставка может превращать текст в "кракозябры".

Это может происходить из-за того, что приложение, из которого производится копирование, помещает текст в буфер обмена в 8-битной кодировке, а то, в которое происходит вставка, запрашивает его в Юникоде (так делает, например, Блокнот). Windows "идёт навстречу" и перекодирует текст. При копировании в буфер помещается также информация о языке. Это может делать само приложение, а если не делает, то Windows просто смотрит, на какой язык ввода было переключено приложение в момент копирования. Если на русский, то используется страница 1251 и при вставке всё нормально. Но если текст русский, а окно приложения было переключено в английский, кодирование пойдёт через 1252 страницу и вместо русских букв пойдут "кракозябры". В таких случаях может помочь предварительное переключение приложения, из которого производится копирование, на русский.

Обратный случай: русский текст помещён в буфер в Юникоде, когда окно было на английском, а вставляется в 8-битной кодировке. Таблица перекодировки берётся опять не та - 1252. Юникодовских кодов для русских букв там просто нет. Не найдя их, Windows использует подстановочный знак для "неизвестного символа" - отсюда вместо русского текста сплошь вопросительные знаки.

https://script-coding.com/CodePages.html
Можно ли как-то подправить, чтобы не переключать?

Добавлено: Пт ноя 15, 2024 00:09
Monarch-LFV
Orion9
Может быть это поможет:

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

ShellExec /SW_SHOWNORMAL %AKELP% "/Command(4193)"
Это параметр почему-то вставляет Юникод, хотя заявлено, что просто вставка после каретки. У меня тоже была такая проблема, тоже вначале делал с 4191, переделал на 4193 - проблема ушла.

Добавлено: Пт ноя 15, 2024 00:21
Loopback
Orion9 писал(а):Но русские символы выводятся как ????
Orion9 писал(а):Только если язык ввода стоит En, тогда появляется проблема.
Не могу подтвердить. У меня по умолчанию везде стоит английская раскладка, давно бы заметил. И я копирую в юникоде (CF_UNICODETEXT), так что это не тот случай.

Откуда берётся текст для копирования? Если просто в скрипте разместить ClipPut с русским текстом - так же? Через плагин Clipboard если посмотреть, там как?
Orion9 писал(а):Но DateDiff, как я понял, более продвинутая: корректно считает дни, учитывая високосные годы.
А проверить? Пример из справки AHK.

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

var1 = "2005-01-26"
var2 = "2004-01-26"
sec = (ToDateTime(var1) - ToDateTime(var2)) / 10000000 / (60 * 60 * 24)
MsgBox(sec)
Orion9 писал(а): Кроме того, не нужно самостоятельно делать вычисления, а лишь указать формат вывода (секунды, минуты, часы, дни).
Ох уж эта лень... Но нет. Такой DateDiff делается пользовательской функцией за пять минут.

Добавлено: Пт ноя 15, 2024 10:39
Orion9
Monarch-LFV писал(а):Это параметр почему-то вставляет Юникод, хотя заявлено, что просто вставка после каретки. У меня тоже была такая проблема, тоже вначале делал с 4191, переделал на 4193 - проблема ушла.
Где-то так :) Я не разобрался с командами AkelPad - тупо взял это с какой-то сборки (даже помню какой - TCIMG, но это было очень, очень давно).

Сейчас открыл справку Akel: правильно использовать Command(4155), т.е. команда "Вставить". Теперь проблемы нет. Command(4191) - "Вставить текст как ANSI" - поэтому была проблема.

Буду благодарен, если кто-то подскажет, как перейти к началу текста в окне AkelPad после подобной вставки.

Добавлено: Пт ноя 15, 2024 10:42
Monarch-LFV
Orion9
Может в конце послать комбинацию Ctrl+Home?

Добавлено: Пт ноя 15, 2024 10:49
sa
Orion9
А чем не устраивает Command(4193)?

Добавлено: Пт ноя 15, 2024 10:56
Orion9
Loopback писал(а):А проверить? Пример из справки AHK.

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

var1 = "2005-01-26"
var2 = "2004-01-26"
sec = (ToDateTime(var1) - ToDateTime(var2)) / 10000000 / (60 * 60 * 24)
MsgBox(sec)
Когда бы я успел проверить? ) Кроме того, как вы уже заметили, у меня явная проблема с датами и всем, что с ними связано :lol: Надо будет наверстать и разобраться в этом чуть лучше )
Loopback писал(а):Ох уж эта лень... Но нет. Такой DateDiff делается пользовательской функцией за пять минут.
Не лень, а недостаток знаний ) Но если это действительно так просто, почему бы не дополнить функционал такой функцией? :wink:

P.S.Все еще под впечатлением от цветомании и ее взаимодействия с ТС. Вот это новые возможности вы добавили Loopback! Оформлю все в рабочий модуль и скину в ближаешее время. Хочу его кое-чем дополнить.

Добавлено спустя 6 минут:
Monarch-LFV писал(а):Orion9
Может в конце послать комбинацию Ctrl+Home?
Каким инструментом? Хотелось бы какой-нибудь встроенной командой AkelPad провернуть)

Добавлено спустя 49 секунд:
sa писал(а):Orion9
А чем не устраивает Command(4193)?
Я вообще не понял, что это значит "Вставить текст из буфера обмена после каретки" :lol:

Добавлено: Пт ноя 15, 2024 10:58
sa
Может, чтобы сразу оказаться в начале текста, а не пытаться переходить к нему потом?

У меня при использовании команды 4193 курсор остаётся в начале вставленного текста, а не в конце, как при 4155 или 4191.

Добавлено: Пт ноя 15, 2024 12:57
Orion9
sa
Не помогло. У меня все-равно курсор улетает вниз (не важно, запущен AkelPad или нет).

Я надеялся как-то передать в параметрах вызова самого AkelPad через ShellExec. Я так понял, что можно передавать имена скриптов к выполнению сразу после запуска окна редактора. Просто сейчас нет времени окунуться в эту тему, думал, может, кто знает.

Добавлено: Пт ноя 15, 2024 14:45
sa
Monarch-LFV писал(а):переделал на 4193 - проблема ушла.
А курсор тоже улетает вниз или остаётся в начале файла (как у меня)?

Добавлено: Пт ноя 15, 2024 14:51
Monarch-LFV
sa
У меня курсор улетает вниз, но честно, если б вы не спросили, даже и не задумался бы и не проверил. Обычно пользуюсь для целей преобразования текста, а там не особо важно где курсор.

Добавлено: Пт ноя 15, 2024 19:17
Orion9
sa
К вечеру до меня дошло, что такое каретка. Очень пугает это слово. :lol:

Нет. Улетает у меня каретка вместе с текстом вниз ) Надо бы разобраться, но сейчас это не в приорететах. Хочу доделать скрипт чтобы было как следует, ведь очень неплохо пока получается.