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

Добавлено: Ср мар 05, 2025 23:22
Orion9
Loopback писал(а):В справке говорится, что если
Накосячил, признаю.
Loopback писал(а):Параметры со значением по умолчанию для таких задач и предназначены
После обновления у меня этот хинт стал переодически появляться с тёмным фоном и светло-жёлтымим полями вместо текста, будто сам текст был закрашен. Но так совпало, что я как раз вносил изменения в эту функцию, поэтому решил уточнить лишний раз, держа в голове недавнюю проблему с опусканием параметров по умолчанию, о чём было выше. Но сейчас подозреваю, что проблема была связана с отсутствием Sleep перед SetHintParam("ShowHint", "Reload"). Я только недавно добавил Sleep(50) к тому коду. Видимо, всё-таки стиль не успевал полностью смениться, поэтому и появлялись поля другого цвета. Но ещё понаблюдаю.

Добавлено: Вс мар 09, 2025 11:20
Orion9
Loopback
Проверил объект Map - всё работает. У вас, случайно, нет планов добавить к нему свойство Count, чтобы можно было перечислять элементы карты? Сейчас для этого требуется создавать временный массив, т.е объект List:

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

Local mFiles = Map()
...
Local i, txt
    Local aKeys = list()
    aKeys.Text = mFiles.Keys()
    For i = 0 To aKeys.Count - 1
        txt &= mFiles[aKeys[i]] & auCRLF                
    Next
    MsgBox(txt)
    Free(aKeys, mFiles)
[cut="Полный тестовый код"]

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

SetHotkeyAction /H:F11 MapObjTest

Func MapObjTest()
    Local ffd = Buffer(604)
    Local file, attr, ini, inst, desc, name
    Local hf = DllCall("FindFirstFileW", "wstr", COMMANDER_PATH & "\Ini\" & "Color*.ini", "ptr", ffd.Ptr)
    If Not (hf > 0) then
       Free(ffd)    
       MsgBox("Файлы Color*.ini не найдены")
       Return
    Endif
    Local mFiles = Map()
    While 1 
       file = ffd.GetStr(44)
       attr = ffd.GetNum(0, "dword")
       If Not BitAND(attr, 16) Then 
          ini = COMMANDER_PATH & "\Ini\" & file
          IniRead inst %ini% "ColorTheme" "Instance" 0
          If inst <> 0 Then
             IniRead desc %ini% "ColorTheme" "Description"          
             IniRead name %ini% "ColorTheme" "Name"
             mFiles.Set (ini, name)
          EndIf
       Endif
       If DllCall("FindNextFileW", "handle", hf, "ptr", ffd.Ptr) = 0 Then Break
    Wend
    DllCall("FindClose", "handle", hf)    
    Free(ffd)
    Local i, txt
    Local aKeys = list()
    aKeys.Text = mFiles.Keys()
    For i = 0 To aKeys.Count - 1
        txt &= mFiles[aKeys[i]] & auCRLF                
    Next
    MsgBox(txt)
    Free(aKeys, mFiles)    
EndFunc
[/cut]
Код завязан на ini-файлы с секцией ColorTheme:
[cut="Файлы"]

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

[ColorTheme]
Name=System
Description=Система
Instance=4

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

[ColorTheme]
Name=Dark
Description=Тёмные тона
Instance=1

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

[ColorTheme]
Name=Roman Silver
Description=Светлые тона
Instance=2
[/cut]
Делал, основываясь на примере из справки, но мне кажется, в нём есть небольшая неточность:

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

If hf <> 0 then 
FindFirstFileW может вернуть -1, а значит условие пропустит код, что может привести к интересным результатам ) И ещё одно уточнение: после последнего вызова FindNextFileW необязательно использовать FindClose?

Был ещё один давний вопрос, который забывал спросить. Некоторые wdx-плагины перестают работать после того, как их загружаешь в объект Plugin и потом освобождаешь через Free. Проверить можно на обычной подсказке:

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

1exts=*.aucfg;autorun.cfg;*.ahk;*.au3; *.vbs
1fields=Число строк: [=linebreakinfo.CRLF Count]\nБайт прочитано: [=linebreakinfo.Bytes Read]
Если в коде добавить две строки:

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

objLineB = Plugin("LineBreakInfo.wdx")
Free(objLineB)
То после запуска ТС, подсказка на панелях не будет работать, т.е. поля плагина в подсказке будут пустыми. Но если убрать Free, то всё нормально.

Можно, конечно, использовать объект без освобождения в некоторых случаях, если он больше не нужен, но будет ли это правильным и не приведёт ли ещё к каким-то проблемам в будущем?

Добавлено: Пн мар 10, 2025 11:01
Loopback
Orion9 писал(а):У вас, случайно, нет планов добавить к нему свойство Count, чтобы можно было перечислять элементы карты?
Не планировалось. Не то чтобы это невозможно, но тут просто сам принцип подразумевает перечисление по списку, т.к. индексом является ключ. Понятно, что лучше если бы сразу возвращался объект списка с ключами, но пока в силу имеющихся ограничений делать так не хотелось бы.
Orion9 писал(а):есть небольшая неточность
Согласен.
Orion9 писал(а):FindClose
Надо, конечно. Делал для проверки DllCall, так он и пошел незаконченный в пример.
Orion9 писал(а):Некоторые wdx-плагины перестают работать после того, как их загружаешь в объект Plugin и потом освобождаешь через Free.
Выглядит вполне вероятно, учитывая что всё находится в едином адресном пространстве. Надо будет посмотреть.
Orion9 писал(а):Можно, конечно, использовать объект без освобождения в некоторых случаях, если он больше не нужен, но будет ли это правильным и не приведёт ли ещё к каким-то проблемам в будущем?
Если создать его однократно глобально или со Static - почему бы и нет.

Добавлено: Пн мар 10, 2025 22:59
Orion9
Loopback, понятно. Собственное перечисление элементов, конечно бы, не помешало. В AutoHotkey, например, используются две переменные:

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

For key, value in objMap {

   }
Но объекту Map всё-равно непросто найти применение, думаю, для многих задач сейчас подойдет простая связка двух объектов List:

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

Local aKyes = List(), aValues = List()
И перечислять их будет гораздо проще.

На счёт DllCall, понял. А вот с плагинами дела, конечно, похуже. Некоторые плагины не просто перестают работать, но и "валят" Тотал, после сообщений об ошибках. Причём, как отмечалось, далеко не все плагины склонны к такому поведению.

Например, у меня в подсказке к jpg-файлам используются два плагина: wdx4i и jpg-comment. Первый никак не реагирует на то, загружается ли он в коде Autorun или выгружается, а вот второй, сразу после выгрузки, сообщает о фатальной ошибке и валит ТС.

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

Crash in plugin jpg-comment.wdx:
Access violation at address 07E58163. Read of address 00000118
Если как-то можно исправить такое поведение, было бы классно. Но на край, можно и не выгружать.

Добавлено: Вт мар 11, 2025 08:17
AkulaBig
Loopback
Хотелось-бы обратить ваше внимание на такой нюанс. Попытался удалить ветку реестра с использованием справки. И выяснилось, что на мой взгляд, ключ "~/K" RegDelete не совсем корректно описан в справке. В справке написано, что "/K При пустом параметре или его отсутствии удаляет ключ целиком." На практике выяснилось, что /K действует по разному при удалении пустого параметра имеющего значение или не имеющего. Например:

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

	If num <> 6 Then
		# регистрация схемы
		# registration scheme
		RegWrite("HKCU\AppEvents\Schemes\Apps\Wincmd\WincmdConnected\.current", "", "REG_SZ", DirSoundsScheme & "Connect.wav")
	Else
		# удаляем схему
		# delete scheme
		RegDelete("~/K", "HKCU\AppEvents\Schemes\Apps\Wincmd\WincmdConnected\.current")

		RegDelete("~/K", "HKCU\AppEvents\Schemes\Apps\Wincmd\WincmdConnected")
		
		RegDelete("~/K", "HKCU\AppEvents\Schemes\Apps\Wincmd")
Если в команде RegDelete("~/K", "HKCU\AppEvents\Schemes\Apps\Wincmd\WincmdConnected\.current") не прописать "~/K" эта ветка не удалится, если значение .current пусто.
Не знаю, понятно-ли я описал проблему? Если все понятно и вы со мной согласны, хотелось-бы увидеть корретировку описания в справке.

Добавлено: Вт мар 11, 2025 11:25
Loopback
Orion9 писал(а):Собственное перечисление элементов, конечно бы, не помешало.
Конструкция for..in давно на всякий случай лежит в todo. Проблема в том, что при необходимости явного освобождения объектов обязательно найдутся те, кто захочет использовать это в виде

for var in List("aa", "bb", "cc")

что неизбежно приведет к утечкам памяти. Разве что принудительно разрешить использовать после in только переменные.
Orion9 писал(а): для многих задач сейчас подойдет простая связка двух объектов List
Сделать так можно, конечно, но тут главное отличие в скорости. Хеш-таблицы намного быстрее работают при необходимости поиска ключевого значения. Да и просто удобнее в ряде случаев. В Autoit я его постоянно использую.
Orion9 писал(а):Если как-то можно исправить такое поведение, было бы классно.
Вероятно, единственный вариант - проверять, загружен ли плагин в данный момент, и если загружен - то не пытаться с ним что-то делать, кроме получения списка полей и данных. Т.е. не загружать повторно библиотеку, не выполнять функции ContentSetDefaultParams и ContentPluginUnloading, и не выгружать библиотеку при освобождении объекта.

Ну а пока не выгружать.

AkulaBig
Под "пустым параметром" в описании к /K имеется в виду параметр функции param. А не фактическая пустота значения в реестре.

Для удаления "HKCU\AppEvents\Schemes\Apps\Wincmd\WincmdConnected\.current", естественно, нужен /K, поскольку без него при пустом значении param будет удалено значение ключа "по умолчанию", а не сам ключ.

Уточню в справке.

Добавлено: Вт мар 11, 2025 12:38
AkulaBig
Loopback писал(а):Под "пустым параметром" в описании к /K имеется в виду параметр функции param. А не фактическая пустота значения в реестре.
Я это не сразу понял, но писать из-за этого не стал-бы.
Loopback писал(а):Для удаления "HKCU\AppEvents\Schemes\Apps\Wincmd\WincmdConnected\.current", естественно, нужен /K, поскольку без него при пустом значении param будет удалено значение ключа "по умолчанию", а не сам ключ.
В том-то и дело, что это не естественно, так как пустой ключ реестра в любом языке удаляется без всяких опций.
Loopback писал(а):Уточню в справке.
Да, всего-то надо две строчки. Одна без ключа "~/K" и описанием, что так удаляется значение по умолчанию и вторая с ключом - удаляется сам ключ. И сразу станет все ясно.
Спасибо за понимание.

Добавлено: Ср мар 12, 2025 19:19
Orion9
Loopback писал(а):Разве что принудительно разрешить использовать после in только переменные.
Если так можно сделать, думаю, как вариант сойдет, почему нет.
Loopback писал(а):Хеш-таблицы намного быстрее работают при необходимости поиска ключевого значения.
Полезная информация, спасибо.
Loopback писал(а):Ну а пока не выгружать.
Да, видимо, только так. Уже попробовал на LineBreakInfo, вроде пока работает.

AkulaBig
Добавьте алгоритм случайного перебора wav-файлов, будет гораздо веселее и интереснее. У вас сейчас всё-равно целый поток крутится, можно сделать, чтобы каждые 5-10 циклов значения ключей в реестре из него перезаписывались новыми случайными wav-файлами. Ничего сложного, а результат вас точно порадует )

[cut]

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

Func ThreadSoundsDir
    Local debg = 1, key, val
    Local ini = DIR_SOUNDS & "Sounds.ini", out, i
        
    If Not FileExist(ini) Then      
       MsgBox("Не найден " & ini)
       Return
    Endif
    
    ProcessExecGetOutput /OEM out %COMSPEC% "/c dir /s /b *.wav" %DIR_SOUNDS%
    
    Local aWav = List()
    aWav.Text = out
    Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
                            "WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")    
    While 1   
        For i = 0 To aNames.Count - 1
           val = aWav[Random(0, aWav.Count-1, 1)]        
           key = "HKCU\AppEvents\Schemes\Apps\Wincmd" & aNames[i] & "\.current"
           RegWrite(key, "", "REG_SZ", val)
           If debg Then      
              OutputDebugString("Autorun: key = " & key)
              OutputDebugString("Autorun: val = " & val)              
           EndIf           
        Next
        Sleep(1000) 
    Wend
    Free(aNames, aWav)
EndFunc

[/cut]
В этом примере файлы выбираются через " dir /s /b *.wav", но можно взять пример выборки через DllCall, который был выше. Да и сам алгоритм можно сделать или доделать на свое усмотрение.
Orion9 писал(а):Думаю, за неделю где-то сделаю.
Посмеялся )

Видимо, всё-таки придётся выложить как есть, поскольку сейчас много других дел и на Autorun времени почти нет, но многое будет без описания и комментариев.

Добавлено: Ср мар 12, 2025 21:32
AkulaBig
Orion9 писал(а):Добавьте алгоритм случайного перебора wav-файлов
Я опирался на тот ваш код. Но уж больно большой объем. Поэтому сделал все по накатанному алгоритму. И сейчас это ведь надо будет Sounds.ini создавать. Да и звуки у меня по темам, а придется еще и в кучу все сваливать. Пока считаю это избыточным.
Orion9 писал(а):Видимо, всё-таки придётся выложить как есть
Делайте, как вы считаете лучше. Вы никому ничего не должны.
Orion9 писал(а):поскольку сейчас много других дел и на Autorun времени почти нет
Я тоже отвлекался.
[cut]
Еще один плагинчик сделал. А он таким вредным оказался. Вернее используемая прожка. Пришлось и ее под себя компилить.
[/cut]

Добавлено: Ср мар 12, 2025 23:21
Orion9
AkulaBig писал(а):надо будет Sounds.ini создавать. Да и звуки у меня по темам, а придется еще и в кучу все сваливать
Sounds.ini необязателен для случайного перебора, да и в кучу не придется все валить. Главное - найти интересные звуки, что может оказаться не такой простой задачей, как кажется. Но для старта вполне подойдет парочка тестовых наборов. Если хотите, попробуйте:
https://www.upload.ee/files/17847052/Sounds.zip.html
AkulaBig писал(а):Делайте, как вы считаете лучше. Вы никому ничего не должны.
Эт точно. И все же... Не надо ставить дедлайнов, чтобы не было дедэндов )
AkulaBig писал(а):Я тоже отвлекался.
Да, я видел. Времени только не было попробовать, но еще обязательно попробую.

Добавлено: Чт мар 13, 2025 04:33
AkulaBig
Orion9 писал(а):попробуйте
Такое впечатление, что мы с вами с одного сайта дергали :) Я хотел хотя-бы одну тему создать, но теперь понял, что это будет не в ближайшее время. Занялся иконками дисков и пока не получается без перезагрузки.

Добавлено: Вс мар 16, 2025 23:19
Orion9
Да уж... Не думал, что всё так затянется.

Угораздило меня залезть в заголовок, что и заняло большую часть времени. Хорошо хоть под корень не стал ничего ломать, а только фич новых довесил. Думаю, тем, кому интересна тема заголовка, найдут что-нибудь для себя интересное:
https://www.upload.ee/files/17862038/TC_11.51.7z.html

Добавил переключение между конфигурациями, что открыло дополнительные возможности. Ну, и собрал все скрипты, которые накопились за это время, как обещал. Фишек там не мало :)
AkulaBig писал(а):Я хотел хотя-бы одну тему создать, но теперь понял, что это будет не в ближайшее время.
Да, со звуками не так всё просто. Можно часами с ними возится. Хорошо, что меня пока R2D2 полностью устраивает в рандомном воспроизведении )

Добавлено: Пн мар 17, 2025 11:03
AkulaBig
Orion9 писал(а):Угораздило меня залезть в заголовок
Да, заголовок суперпрофессиональный получился. Только постоянно появляется надпись pinding... или другие служебные сообщения. Похоже тяжеловато наполнение для постоянного обновления. Хотя конечно это все настраивается. UP, DN без названия. Наверное не всем понятно будет. Видимо не хватает места. Зачем тогда постоянно висит надпись Zyxel Offline? Какое у ней предназначение? Я уж подумал тантрическое. У меня раньше был роутер этой марки. И ведь я не поленился поставить лестницу и посмотреть. Но нет, стоит роутер другой фирмы. Никакого полтергейста :D
С остальным еще не разбирался. Буду потихоньку подсматривать.

Добавлено: Вт мар 18, 2025 23:09
Orion9
AkulaBig
Смешно у вас в конце получилось, улыбнуло )
AkulaBig писал(а):Да, заголовок суперпрофессиональный получился.
Ну, такой вид заголовок приобрёл не сразу - потребовался целый год, чтобы навесить фич. Первая версия ещё хранится на форуме и она содержит всего 200 строк, но кроме пинга и производительности там ничего нет :)
https://forum.wincmd.ru/viewpost.php?p=137062
AkulaBig писал(а):Только постоянно появляется надпись pinding... или другие служебные сообщения.
У меня возникла однажды потребность следить за устройствами в сети. Утилит в этом плане, конечно, хватает, например, тот же PingInfoView от NirSoft, но полностью такие утилиты мне не подошли. Решил попробовать сделать свой скрипт ) И хотя эта тема мне была интересна, скрипт я так и не доделал - отчасти потому, что необходимость постепенно отпала, а отчасти потому, что в заголовке одного пинга стало хватать ) Но сам скрипт прикольный и рабочий, просто в нём не хватает немного функционала:
https://www.upload.ee/files/17870332/Ping.7z.html

Ох, помню, не повезло мне с кодом иконки - нашёл какой-то полурабочий вариант, который руками потом пришлось дорабатывать, а сейчас смотрю на этот NumPut и понимаю, что Loopback сделал работу с буфером куда круче и удобнее, чем в самом AutoHotkey! :lol:

Ну, а что касается служебных сообщений, так мне наоборот нравится, когда видно, что в фоне происходит: крутится там вертится, живёт своей жизнью...) Даже специально задержку добавил, чтобы такие сообщения не мелькали слишком быстро )
AkulaBig писал(а):UP, DN без названия. Наверное не всем понятно будет.
Пробовал разные варианты. Больше всего понравились стрелки "вниз" и "вверх". Сейчас их можно добавить к скорости передачи ключом SpeedArrows в файле конфигурации, но смотрятся они хорошо, только если нет разделителя между блоками. В итоге, пришёл к тому, что лучше вообще ничего не добавлять перед объемом трафика и скоростью передачи. Ну, а на крайний случай, если вдруг хочется попробовать - изменения всегда можно внести напрямую в aucfg-скрипт.
AkulaBig писал(а):Видимо не хватает места.
Места, пожалуй, хватит на всё. Но иногда нужно разгрузить заголовок - сделать его более компактным в один клик. Сначала взялся за шаблоны, но потом понял, что лучше сразу сделать переключение всей конфигурации. Тем более, что это даёт возможность менять все параметры сразу, включая геолокацию, настройки пинга и интервалы обновления информеров. Если, например, сделать конфигурацию, где будет отключен пинг, информеры и планировщик, то в заголовке не будет мелькать никакой служебной информации.
AkulaBig писал(а):Зачем тогда постоянно висит надпись Zyxel Offline? Какое у ней предназначение?
Показывает, что устройство в оффлайне. Zyxel, конечно, только для примера - пинговать можно что угодно: сетевые хранилища, роутеры, холодильники, телевизоры и стиральные машинки :mrgreen:
AkulaBig писал(а):Я уж подумал тантрическое
Нет, тут больше дзен.) Как сказал один великий дзен мастер, когда ученики спросили его, что им делать с пингом - "Да хоть на стену его повесьте" :mrgreen: Ну, стены-то у нас нет, зато есть заголовок ТС :mrgreen: Так что будем и дальше развешивать ненужные датчики ))

Добавлено: Ср мар 19, 2025 10:52
AkulaBig
Orion9 писал(а):мне наоборот нравится, когда видно, что в фоне происходит
Дак эти сообщения полностью стирают данные. Пусть где-нибудь в уголке живут своей жизнью, но не на весь заголовок.
Orion9 писал(а):Больше всего понравились стрелки "вниз" и "вверх".
Круто. Надо себе забрать.
Orion9 писал(а):Zyxel, конечно, только для примера
Увидел, что это у вас ручками вбито. Все ясно. а я думал автоматом определяется.