Страница 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)
Когда бы я успел проверить? ) Кроме того, как вы уже заметили, у меня явная проблема с датами и всем, что с ними связано

Надо будет наверстать и разобраться в этом чуть лучше )
Loopback писал(а):Ох уж эта лень... Но нет. Такой DateDiff делается пользовательской функцией за пять минут.
Не лень, а недостаток знаний ) Но если это действительно так просто, почему бы не дополнить функционал такой функцией?
P.S.Все еще под впечатлением от цветомании и ее взаимодействия с ТС. Вот это новые возможности вы добавили
Loopback! Оформлю все в рабочий модуль и скину в ближаешее время. Хочу его кое-чем дополнить.
Добавлено спустя 6 минут:
Monarch-LFV писал(а):Orion9
Может в конце послать комбинацию Ctrl+Home?
Каким инструментом? Хотелось бы какой-нибудь встроенной командой AkelPad провернуть)
Добавлено спустя 49 секунд:
sa писал(а):Orion9
А чем не устраивает Command(4193)?
Я вообще не понял, что это значит "Вставить текст из буфера обмена после каретки"

Добавлено: Пт ноя 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
К вечеру до меня дошло, что такое каретка. Очень пугает это слово.
Нет. Улетает у меня каретка вместе с текстом вниз ) Надо бы разобраться, но сейчас это не в приорететах. Хочу доделать скрипт чтобы было как следует, ведь очень неплохо пока получается.