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

Добавлено: Сб фев 15, 2025 09:11
AkulaBig
Orion9 писал(а):к заголовку Total Commander это отношения уже не имеет.
Это тот-же самый вывод заголовка через TCIMG. Там можно задать координаты размещения заголовка, причем отрицательные.
Orion9 писал(а):Да всё так же, как у вас меню перезагрузки сделано.
Похоже просто хинты сделаю и этого будет достаточно.
Orion9 писал(а):можно ли там английские имена в русскоязычной системе вызвать.
В справке написано "Функция возвращает локализованную строку в соответствии с настройками локали".
Orion9 писал(а):Но надо поднажать в ближайшее время
Будем ждать.

Добавлено: Сб фев 15, 2025 12:24
Loopback
Orion9 писал(а):Значит, ошибка вызова RegRead была связана с раскрытием переменных?
Нет, не связана.
Orion9 писал(а):В общем, нашел пока обходной путь через stdout, ведь дело не может стоять на месте )
Вот это правильный подход! Не ждать, а делать, используя имеющиеся возможности. Ещё, наверно, через WMI можно получить.

Добавлено: Сб фев 15, 2025 23:14
Orion9
Loopback
Не знал, что через WMI можно, но результат через COMSPEC меня более чем устроил. Даже больше подошёл к задаче.

Практически всё готово. Только описание позже перепишу, когда буду собирать скрипты. Возможно, сделаю его более подробным.

[cut="Sounds.ini"]

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

[Random]
Enable=0
Interval=5000
Directory=%Windir%\Media
Mode=1
Debug=1
WincmdConnected=*
WincmdCopyComplete=Alisa1
WincmdDeleteComplete=Chewbacca
WincmdPackComplete=Операция Ы
WincmdSearchComplete=Random\Search
WincmdTransferComplete=Archer
WincmdUnpackComplete=**

[Custom]
Dir1=%Windir%\Media
Dir2=%COMMANDER_PATH%\Ini\Sounds\Chewbacca\
Dir3=
Dir4=%COMMANDER_PATH%\Ini\Sounds\StarCraft\
Dir5=

[EventLabels]
Wincmd=Total Commander
WincmdConnected=FTP-соединение установлено
WincmdCopyComplete=Копирование/перемещение завершено
WincmdDeleteComplete=Удаление завершено
WincmdPackComplete=Упаковка завершена
WincmdSearchComplete=Поиск завершён
WincmdTransferComplete=Передача завершена
WincmdUnpackComplete=Распаковка завершена

[Scheme1]
Name=Алиса #1
Folder=Alisa1
Description=Алиса знает, что делать! #1
WincmdConnected=Соединение.wav
WincmdCopyComplete=Копирование.wav
WincmdDeleteComplete=Удаление.wav
WincmdPackComplete=Упаковка.wav
WincmdSearchComplete=Поиск.wav
WincmdTransferComplete=Передача.wav
WincmdUnpackComplete=Распаковка.wav

[Scheme2]
Name=Алиса #2
Folder=Alisa2
Description=Алиса знает, что делать! #2
WincmdConnected=Соединение.wav
WincmdCopyComplete=Копирование.wav
WincmdDeleteComplete=Удаление.wav
WincmdPackComplete=Упаковка.wav
WincmdSearchComplete=Поиск.wav
WincmdTransferComplete=Передача.wav
WincmdUnpackComplete=Распаковка.wav

[Scheme3]
Name=Archer
Folder=Archer
Description=Archer
WincmdConnected=TC Connected To FTP.wav
WincmdCopyComplete=TC Operation Complete.wav
WincmdDeleteComplete=TC Delete Complete.wav
WincmdPackComplete=TC Pack Complete.wav
WincmdSearchComplete=TC Search Complete.wav
WincmdTransferComplete=TC Transfer Complete.wav
WincmdUnpackComplete=TC Unpack Complete.wav

[Scheme4]
Name=Операция Ы
Folder=Операция Ы
Description=Операция Ы
WincmdConnected=Со взломом или без.wav
WincmdCopyComplete=Мелкое хулиганство - крупные деньги.wav
WincmdDeleteComplete=Пол-литра вдребезги.wav
WincmdPackComplete=Сворачивайтесь - есть дело.wav
WincmdSearchComplete=Где бабуля - я за неё.wav
WincmdTransferComplete=Всё уже украдено до нас.wav
WincmdUnpackComplete=Расхититель соцсобственности.wav

[/cut]
[cut="Sounds.aucfg"]

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

Pragma IncludeOnce

Global THREAD_SOUND = 0
Global RANDOM_SOUND = 0
Global RANDOM_DIRECTORY = ""

Global DirSounds  = %COMMANDER_PATH% & "\Ini\Sounds\"

# 61900-61999

RegisterCommand 61980 "RegSoundScheme" 0 

RegisterCommand 61981 "RegSoundScheme" 1
RegisterCommand 61982 "RegSoundScheme" 2
RegisterCommand 61983 "RegSoundScheme" 3
RegisterCommand 61984 "RegSoundScheme" 4
RegisterCommand 61985 "RegSoundScheme" 5
RegisterCommand 61986 "RegSoundScheme" 6
RegisterCommand 61987 "RegSoundScheme" 7
RegisterCommand 61988 "RegSoundScheme" 8
RegisterCommand 61989 "RegSoundScheme" 9
RegisterCommand 61990 "RegSoundScheme" 10

RegisterCommand 61991 "SoundDirectory" 1
RegisterCommand 61992 "SoundDirectory" 2
RegisterCommand 61993 "SoundDirectory" 3
RegisterCommand 61994 "SoundDirectory" 4
RegisterCommand 61995 "SoundDirectory" 5

RegisterCommand 61996 "SoundConsole"
RegisterCommand 61997 "RandomSounds" 1
RegisterCommand 61998 "RandomSounds" 2
RegisterCommand 61999 "RandomSounds" 3

# запуск потока
# если ключ Enable=1
RunThread ThreadSounds 0

Func SoundDirectory(lParam, wParam)
    Local ini = DirSounds & "Sounds.ini", dir
        
    If Not FileExist(ini) Then
       MsgBox("Не найден " & ini, "Sounds", 48)
       Return
    Endif

    IniRead dir %ini% "Custom" %"'Dir' & %wParam%" ""
    Sleep(10)
    IniWrite %ini% "Random" "Directory" %dir%
    Sleep(100)    
    IniRead dir %ini% "Random" "Directory" ""
    If dir = "" Then dir = "<Empty>"
    MsgBox("Текущая директория: " & dir, "Sounds", 64)    
EndFunc

Func SoundConsole(lParam)
    Local key, val, count = 0
    Local ini = DirSounds & "Sounds.ini", i, j, txt
        
    If Not FileExist(ini) Then
       MsgBox("Не найден " & ini, "Sounds", 48)
       Return
    Endif
    
    Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
                            "WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")    
    While 1   
        txt = ''
        For i = 0 To aNames.Count - 1     
           key = "HKCU\AppEvents\Schemes\Apps\Wincmd\" & aNames[i] & "\.current"
           val = RegRead(key, '', '')
           #txt &=  aNames[i] & auTAB & StrTrim(val) & auCRLF
           cmd = "reg query " & key & " /ve"
           ProcessExecGetOutput /OEM out %COMSPEC% "/c %cmd%"          
           txt &= StrTrim(out) & auCRLF & auCRLF
        Next
        count += 1
        SetHintParam("ShowHint", "Font", 9, "Consolas")
        SetHintParam("ShowHint", "BackColor", 0x00000000)
        SetHintParam("ShowHint", "Text", 0xFFFFFF)   
        ShowHint("Чтений: " & count & _
                 " Поток: " & (THREAD_SOUND = 0 ? "Нет" : "Да ") & _
                 " Режим: " & (RANDOM_SOUND = 0 ? "Нет" : RANDOM_SOUND) & auCRLF & StrTrim(txt))
        j = 0
        While j < 1000
           Sleep(100)
           j += 100
           If IsPressed (0x1B) Then Break
        Wend
        SetHintParam("ShowHint", "Reload")                   
        If IsPressed (0x1B) Then Break        
    Wend    
    Free(aNames)
    ShowHint("Монитор значений остановлен")
EndFunc

Func RegSoundScheme(lParam, nItem)
    Local ini = DirSounds & "Sounds.ini"
    Local sect = "Scheme" & nItem, name, fold, desc
    
    If THREAD_SOUND Then
       MsgBox("Для регистрации схемы необходимо остановить случайный перебор файлов в каталоге" & auCRLF & auCRLF & _
              "Корневой каталог: " & RANDOM_DIRECTORY, "Sounds")
       Return
    EndIf       
     
    If Not FileExist(ini) Then      
       ShowHint("Не найден " & ini)
       Return
    Endif

    IniRead name %ini% %"%sect%" "Name"  
    IniRead fold %ini% %"%sect%" "Folder"  
    IniRead desc %ini% %"%sect%" "Description"

    Local ErrNum = 0        
    Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
                            "WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")
    # параметр 0 
    # отключение звуковой схемы                         
    If nItem = 0 Then
       For i = 0 To aNames.Count - 1
          key = "HKCU\AppEvents\Schemes\Apps\Wincmd\" & aNames[i] & "\.current"
          RegWrite(key, "", "REG_SZ", "")
          If ERROR = 1 Then ErrNum += 1
      Next
      Free(aNames)      
      RegWrite("HKCU\AppEvents\Schemes\Apps\Wincmd", "", "REG_SZ", "Total Commander")       
      If ErrNum = 0 Then
         MsgBox("Звуковая схема отключена.", "Sounds", 64)
      Else
         MsgBox("Ошибок во время операции: " & ErrNum & auCRLF & auCRLF & _
                "Звуковая схема отключена с ошибками.", "Sounds", 48)      
      Endif
      Return
    EndIf

    # чтение и проверка конфигурации                            
    Local aFiles = List(), ErrLog = ""
    For i = 0 To aNames.Count-1
        key = aNames[i]
        IniRead val %ini% %"%sect%" %"%key%"
        If val = "" Then
           ErrLog &= "Пустое значение ключа <" & key & "> секции [" & sect & "]" 
           Break            
        EndIf
        val = DirSounds & fold & "\" & val
        If FileExist(val) Then
           aFiles.Add(val)
        Else
           ErrLog &= val & auCRLF  
        Endif   
    Next
    
    If StrLen(ErrLog) > 0 Then
       MsgBox("Не найдены файлы схемы: " & auCRLF & auCRLF & ErrLog, "Sounds", 48)
       Free(aNames, aFiles)      
       Return
    Endif
   
    # регистрация схемы    
    For i = 0 To aFiles.Count - 1
        key = "HKCU\AppEvents\Schemes\Apps\Wincmd\" & aNames[i] & "\.current"
        RegWrite(key, "", "REG_SZ", aFiles[i])
        If ERROR = 1 Then ErrNum +=1
    Next
    Free(aNames, aFiles)    
    RegWrite("HKCU\AppEvents\Schemes\Apps\Wincmd", "", "REG_SZ", "Total Commander")

    If ErrNum = 0 Then
       MsgBox("Схема """ & name & """ зарегистрирована", "Sounds", 64)
    Else
       MsgBox("Ошибок во время операции: " & ErrNum & auCRLF & auCRLF & _
              "Звуковая схема зарегистрирована с ошибками.", "Sounds", 48)      
    Endif                 
EndFunc

# wParam: 
# 1 - Все файлы
# 2 - Подкаталоги
# 3 - Остановить поток
Func RandomSounds(lParam, wParam)   
    # запуск потока
    If wParam < 3 Then
       If Not THREAD_SOUND Then
          RunThread ThreadSounds %"%wParam%"
          For i = 1 To 25
             If THREAD_SOUND And RANDOM_SOUND Then
                MsgBox("Случайный перебор включен" & auCRLF & auCRLF & "Корневой каталог: " & RANDOM_DIRECTORY, "Sounds", 64)
                Return
             EndIf   
             Sleep(100)
          Next   
       Else
          MsgBox("Поток уже запущен", "Sounds", 48)
       EndIf   
    Endif
    # остановка потока
    If wParam = 3 Then
       Local ini = DirSounds & "Sounds.ini"    
       IniWrite %ini% "Random" "Enable" 0       
       RANDOM_SOUND = false       
       For i = 1 To 25
          If Not THREAD_SOUND Then
             MsgBox("Случайный перебор остановлен", "Sounds", 64)
             Return
          EndIf   
          Sleep(100)
       Next         
    Endif
EndFunc

Func ThreadSounds(RandMode)
    Local debg = 1, intv, key, val, dir
    Local ini = DirSounds & "Sounds.ini", out, i, j
        
    If Not FileExist(ini) Then      
       MsgBox("Не найден " & ini, "Sounds", 48)
       Return
    Endif
    
    # вызов из меню
    If RandMode > 0 Then
       IniWrite %ini% "Random" "Enable" 1
       IniWrite %ini% "Random" "Mode" %RandMode% 
    EndIf          
    # авто
    IniRead RANDOM_SOUND %ini% "Random" "Enable" 0 
    If Not RANDOM_SOUND Then Return
    
    IniRead debg %ini% "Random" "Debug" 0       
    IniRead intv %ini% "Random" "Interval" 3000
    If Not IsInt(intv) Or intv < 1000 Then intv = 1000
    
    IniRead dir %ini% "Random" "Directory" ""    
    If dir = "" Then 
       dir = DirSounds
    Else
       If Not FileExist(dir) Then
          MsgBox("Не найден каталог " & dir & auCRLF & auCRLF & "Источник " & ini, "Sounds", 48)
          Return         
       EndIf
    EndIf 
    
    # режим случайных значений
    IniRead RANDOM_SOUND %ini% "Random" "Mode" 1
    If Not IsInt(RANDOM_SOUND) Then RANDOM_SOUND = 1
    If RANDOM_SOUND < 1 And RANDOM_SOUND > 2 Then RANDOM_SOUND = 1 
    
    # загрузка файлов в массив
    ProcessExecGetOutput /OEM out %COMSPEC% "/c dir /s /b *.wav" %"%dir%"
    Local aWav = List()
    aWav.Text = out
    If aWav.Count = 0 Or Not StrPos(aWav[0], ".wav") Then
       MsgBox("Не найдены звуковые файлы *.wav в каталоге " & dir, "Sounds", 48)
       Return
    Endif
    RANDOM_DIRECTORY = dir
    
    # ключи в реестре
    Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
                            "WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")    

    # вспомогательные массивы
    # распределение случайного перебора
    Local aVal = List(), aPos = List(), aEnd = List()
    For i = 0 To aNames.Count-1
        key = aNames[i]
        If RANDOM_SOUND = 1 Then
           val = "**"
        Else
           IniRead val %ini% "Random" %"%key%" "*"
        EndIf   
        aVal.Add(val)
        If val = "*" Then
           aPos.Add(-1)
           aEnd.Add(-1)
        ElseIf val = "**" Then
           aPos.Add(0)
           aEnd.Add(aWav.Count-1)        
        Else 
           Local dir = "\" & val & "\", found = false
           For j = 0 To aWav.Count-1
               If StrPos(aWav[j], dir) Then 
                  found = true
                  Break
               EndIf   
           Next
           If Not found Then j = -1           
           pos = j
           aPos.Add(pos)
           If pos > -1 Then 
              For j = pos To aWav.Count-1
                  If Not StrPos(aWav[j], dir) Then Break
              Next
              If j < aWav.Count-1 Then j = j - 1
              aEnd.Add(j)              
           Else
              aEnd.Add(-1)
           EndIf
        EndIf    
    Next
    
    If debg Then
       OutputDebugString("Autorun: aWav = " & aWav.Text)
       OutputDebugString("Autorun: aVal = " & aVal.Text)       
       OutputDebugString("Autorun: aPos = " & aPos.Text)
       OutputDebugString("Autorun: aEnd = " & aEnd.Text)        
    EndIf
    
    THREAD_SOUND = 1 
    While RANDOM_SOUND
        For i = 0 To aNames.Count - 1
           If aPos[i] = -1 Then Continue
           # случайные значения
           val = aWav[Random(aPos[i], aEnd[i], 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
        j = 0
        While j < intv 
           Sleep(100)
           j += 100
           If Not RANDOM_SOUND Then Break
        Wend   
    Wend    
    Free(aNames, aWav, aVal, aPos, aEnd)
    THREAD_SOUND = 0
EndFunc

# все wav в каталоге
# простой алгоритм случайного выбора
Func ThreadSoundsDir
    Local debg = 1, key, val
    Local ini = DirSounds & "Sounds.ini", out, i
        
    If Not FileExist(ini) Then      
       MsgBox("Не найден " & ini)
       Return
    Endif
    
    ProcessExecGetOutput /OEM out %COMSPEC% "/c dir /s /b *.wav" %DirSounds%
    
    Local aWav = List()
    aWav.Text = out
    Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
                            "WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")    
    While RANDOM_SOUND   
        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]
[cut="Sounds.txt"]

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

Регистрация звуковой схемы Total Commander

Для регистрации схемы используется диапазон команд 61980-61990. Код 61980 отключает регистрацию. Коды 61981-61990 регистрируют соответсвующие секции Sounds.ini с именами Scheme1-Scheme10.

Команды с кодами 61991-61995 устанавливают корневой каталог для случайного перебора (секция Custom). Полученное значение записывается в ключ Directory секции Random. Если значение Directory пустое, корневой каталог берется из заголовка скрипта Autorun. По умолчанию это %COMMANDER_PATH%\Ini\Sounds\

Случайный перебор выбирает все wav-файлы из корневого каталога в случайном порядке (режим "Все"), включая подкаталоги, и использует их в качестве звуковой схемы.

В режиме "Каталоги" на каждое событие можно указать отдельный подкаталог с wav-файлами, относительно корневого каталога. Файлы из этого каталога будут проигрываться в случайном порядке только для данного события. Одиночная звёздочка (*) позволяет игнорировать указанное событие для случайного перебора. Двойная звёздочка (**) проигрывает все wav-файлы для данного события из корневого каталога, включая подкаталоги. 

Для случайного перебора можно использовать любые wav-файлы, не регистрируя звуковые схемы. Секция Random управляет параметрами перебора. Коды команд 61997-61999.

Interval задается в милисекундах. Debug - выводит информацию в системный отладчик. Mode - режим перебора (1-2). Для просмотра значений в реестре используется "Монитор значений" (код 61996). За изменениями можно следить в режиме реального времени. ESC - выход из окна монитора.
[/cut]
[cut="Sounds.bar"]

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

[Buttonbar]
Buttoncount=23
button1=mmsys.cpl
cmd1=rundll32.exe
param1=Shell32.dll,Control_RunDLL MMSYS.CPL,Sounds,2
iconic1=1
menu1=Звуки...
button2=%COMMANDER_PATH%\Utilites\AkelPad\AkelPad.exe
cmd2=%COMMANDER_PATH%\Utilites\AkelPad\AkelPad.exe
param2=Sounds.txt
path2=%COMMANDER_PATH%\Ini\Sounds\
iconic2=0
menu2=Справка...
button3=%COMMANDER_PATH%\Utilites\AkelPad\AkelPad.exe
cmd3=%COMMANDER_PATH%\Utilites\AkelPad\AkelPad.exe
param3=Sounds.ini
path3=%COMMANDER_PATH%\Ini\Sounds\
iconic3=0
menu3=Настройки...
button4=
iconic4=0
button5=mmsys.cpl
cmd5=61983
iconic5=1
menu5=Схема "Archer"
button6=mmsys.cpl
cmd6=61981
iconic6=1
menu6=Схема "Алиса 1"
button7=mmsys.cpl
cmd7=61982
iconic7=1
menu7=Схема "Алиса 2"
button8=mmsys.cpl
cmd8=61984
iconic8=1
menu8=Схема "Операция Ы"
button9=mmsys.cpl
cmd9=61985
iconic9=1
menu9=Схема "StarCraft"
button10=mmsys.cpl
cmd10=61986
iconic10=1
menu10=Схема "Chewbacca"
button11=shell32.dll,131
cmd11=61980
iconic11=1
menu11=Схема "Не использовать"
button12=
iconic12=0
button13=%COMMANDER_EXE%,37
cmd13=61997
iconic13=1
menu13=Случайные: Все
button14=%COMMANDER_EXE%,37
cmd14=61998
iconic14=1
menu14=Случайные: Каталоги
button15=%COMMANDER_EXE%,36
cmd15=61999
iconic15=1
menu15=Случайные: Остановить
button16=
iconic16=0
button17=%COMMANDER_EXE%,1
cmd17=61991
iconic17=1
menu17=Windows\Media
button18=%COMMANDER_EXE%,1
cmd18=61992
iconic18=1
menu18=Sounds\Chewbacca\
button19=%COMMANDER_EXE%,1
cmd19=61993
iconic19=1
menu19=\
button20=%COMMANDER_EXE%,1
cmd20=61994
iconic20=1
menu20=Sounds\StarCraft\
button21=%COMMANDER_EXE%,1
cmd21=61995
iconic21=1
menu21=\
button22=
iconic22=0
button23=%COMSPEC%
cmd23=61996
iconic23=0
menu23=Монитор значений в реестре
[/cut]
[cut="Кнопка"]

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

TOTALCMD#BAR#DATA
"%COMMANDER_PATH%\Bars\Sounds.bar"

mmsys.cpl
Sounds
%COMMANDER_PATH%\Bars\
1
-1
[/cut]
AkulaBig
Думаю, за неделю где-то сделаю. Надеюсь, по крайней мере.

Добавлено: Вс фев 16, 2025 09:54
AkulaBig
Loopback
Какие-то непонятки с информацией о виртуальной памяти и файле подкачки.
Изображение
Почему-то в аиде виртуальная память и файл подкачки диаметрально противоположно вашей показывает. А что за огромная цифра у вас в значении виртуальная память, совершенно не понятно.
Внизу видно строку, которая выводит эти данные. Вроде-бы все правильно.
Посмотрите, пожалуйста. Ошибка это или нет.
Orion9
Orion9 писал(а):Думаю, за неделю где-то сделаю.
Не торопитесь. Я пока даже не разбирался с этим.

Добавлено: Вс фев 16, 2025 12:27
Loopback
AkulaBig писал(а):Какие-то непонятки с информацией о виртуальной памяти и файле подкачки.
Тут есть неточности в документации. Индекс 3 - максимально возможный размер файла подкачки, 4 - доступный размер файла подкачки, 5 - сколько памяти всего доступно процессу, 6 - сколько свободной памяти доступной процессу. Вот тут можно подробнее посмотреть о смысле возвращаемых значений. Индекс 3 никак не отражает размер файла подкачки.

Документацию потом поправлю.

Такие цифры для вирт. памяти - я так понимаю это в 64-битной версии. Потому что в 32-битной этот параметр возвращает адекватные значения:

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

for i = 3 to 6
   OutputDebugString(StrFormat("%.0f", GetMemStats(i) / 1048576))
next
18099
9858
2048
1860

Тут надо разобраться, не очень понятно.

Добавлено: Вс фев 16, 2025 12:46
AkulaBig
Loopback
Loopback писал(а):есть неточности в документации
Теперь все ясно. Значит не зря у меня возникли сомнения.
Loopback писал(а):Код в редакторе точно для этого вывода?
Специально и привел код, чтобы было видно, что я все правильно сделал. Ну точно, дело оказалось в ТС х64. В ТС х32, как и у вас, показывает правильно. И причем эти-же цифры. Тогда все-же обратите еще внимание, что вроде данные перевернутые. У вас-же тоже первые цифры относятся к файлу подкачки, а вторые к виртуальной памяти. А в аиде наоборот. И вроде по размеру файла подкачки аида правильно показывает.

Добавлено: Вс фев 16, 2025 12:54
Loopback
AkulaBig
Исправил ответ, не проверил в x64.
AkulaBig писал(а):А в аиде наоборот.
Нет смысла напрямую сравнивать с аидой, терминология может различаться.

Добавлено: Вс фев 16, 2025 13:09
AkulaBig
Loopback писал(а):терминология может различаться
Согласен. В общем все равно написал не зря.

Добавлено: Вс фев 16, 2025 18:35
Orion9
Loopback писал(а):Так что рекомендую не привыкать к Opt, он в следующей версии будет упразднён за ненадобностью.
А как можно будет раскрывать переменные? Сейчас такое поведение иногда играет на руку. Например, если в ini-файле есть запись с переменной окружения, то после её считывания командой IniRead и дальнейшей передачей в функцию, она раскрывается:

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

[Section]
Key=%Windir%\Media

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

IniRead val %ini% "Section" "Key"
MsgBox(val)
Если использовать Opt, она не раскроется:

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

IniRead val %ini% "Section" "Key"
Opt("FuncExpandVars", 0)
MsgBox(val)
Opt("FuncExpandVars", 1)
А как будет в следующей версии?

AkulaBig
Мое скромное имхо, но может вам пригодиться. Такую информацию, как сведения о виртуальной памяти, необязательно отображать прямо в заголовке. Можно, например, использовать подсказку, которая будет всплывать при наведении на заголовок:

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

ControlSetHint /F /D:300 /H:2 0 "GetHintText"

Func GetHintText()
    Local txt, i
    txt = "Виртуальная память:" & auCRLF  
    for i = 3 to 6
        txt &= "GetMemStats(" & i & ") = " & StrFormat("%.0f", GetMemStats(i) / 1048576) & auCRLF
    next
    return StrTrim(txt)
EndFunc
Можно развить эту тему и подключить CTRL при наведении на заголовок:

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

ControlSetHint /F /D:300 /H:2 0 "GetHintText"

Func GetHintText()
    Local txt, i
    If IsPressed(0x11) Then
       ProcessExecGetOutput txt %COMSPEC% '/c type KEYBOARD.TXT' %COMMANDER_PATH%
       txt = StrLeft(txt, 1000)
       Return txt
    Endif   
    txt = "Виртуальная память:" & auCRLF     
    for i = 3 to 6
        txt &= "GetMemStats(" & i & ") = " & StrFormat("%.0f", GetMemStats(i) / 1048576) & auCRLF
    next
    return StrTrim(txt)
EndFunc
В общем, тут есть где фантазии погулять)

Добавлено: Вс фев 16, 2025 18:49
AkulaBig
Orion9 писал(а):Такую информацию, как сведения о виртуальной памяти, необязательно отображать прямо в заголовке.
Да я ее не собираюсь отображать. Просто косячки нашел.
Кстати, сделала хинты на форматы даты и времени. Вроде неплохо получилось. А вот с движением строки не так все просто. Посмотрел в других сборках. Заголовок все равно перемещается, даже с форматированием данных. Насколько я понимаю, это из-за разной ширины символов. Причем даже если выводить незначащие нули, что-то все равно двигается.

Добавлено: Вс фев 16, 2025 19:17
Loopback
Orion9 писал(а):А как можно будет раскрывать переменные? Сейчас такое поведение иногда играет на руку.
К сожалению, такое поведение оказалось очень вредно по умолчанию. Развернуть будет легко, только это нужно будет делать явно с функцией Set:

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

IniRead val %ini% "Section" "Key"
MsgBox(Set(val))
В командной записи ничего не изменится.

Добавлено: Вс фев 16, 2025 23:10
Orion9
AkulaBig писал(а):Заголовок все равно перемещается, даже с форматированием данных.
Именно поэтому я не тороплюсь переделывать свой заголовок и добавлять к нему новые фичи. Тут ещё подумать надо. Кроме того, придётся очень многое ломать, если переделывать с использованием новых функций Autorun, а за такое я точно не готов пока браться. Но кое-что по мелочи уже сделал, например, взял GetCPUUsage, а учитывая объект List, хочу ещё расширить функционал планировщика заданий до нескольких команд, вместо одной, как это сейчас.
Loopback писал(а):Развернуть будет легко, только это нужно будет делать явно с функцией Set
Понял. Это как раз то, что нужно. Если функция Opt совсем исчезнет, то, может быть, мне лучше уже сейчас от неё избавиться, чтобы потом сюрприза не было? )

Попробовал сейчас:

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

nRecv = GetNetInterfaceInfo(nIntfIdx, 'Recv')
nSend = GetNetInterfaceInfo(nIntfIdx, 'Sent')
За этой функцией не наблюдались проблемы? Когда вызвал её первые несколько раз, данные сильно отличались о системных (или от той же AIDA64). Но когда перезапустил интерфейс (отключил его и снова включил), вроде бы всё правильно показывает.

Добавлено: Пн фев 17, 2025 10:35
Loopback
Orion9 писал(а):Если функция Opt совсем исчезнет, то, может быть, мне лучше уже сейчас от неё избавиться, чтобы потом сюрприза не было? )
По желанию :) Надеюсь следующей версии ждать придется недолго. Но изменения будут глобальнее и затронут не только строчные функции. Чуть позже напишу анонс.
Orion9 писал(а):За этой функцией не наблюдались проблемы?
Я ее использую больше года на постоянной основе, вроде нет.

Правда, это если использовать для замера скорости. Если считать потребленный трафик, то при насчитанном объёме более 4Gb будет сброс на ноль, ограничение использованных функций. Переписывать на новые пока нет времени и желания.

Добавлено: Пн фев 17, 2025 22:50
Orion9
Loopback писал(а):Если считать потребленный трафик, то при насчитанном объёме более 4Gb будет сброс на ноль, ограничение использованных функций.
Ну вот. А я-то думал, все мои проблемы уже решены, а тут с бубном прыгать надо )

Ну попрыгал чуть-чуть, вроде полегчало, вопрос только насколько:

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

Func GetNetStat(ByRef nRecv, ByRef nSend)
    Static wq = WMIQuery()     
        
    wq.Query("select * from Win32_PerfRawData_Tcpip_NetworkInterface where CurrentBandWidth > 0")
    wq.Next()

    nRecv = SizeFormat(wq.GetValue("BytesReceivedPersec"), 1, 'G', 2, 1)
    nSend = SizeFormat(wq.GetValue("BytesSentPersec"), 1, 'G', 2, 1) 
EndFunc     
Не уверен, что это правильно и будет работать на всех конфигурациях. Если есть лучший вариант, сообщите, пожалуйста.

И что касается переменной wq в данном примере, всё ли правильно? Допустимо такое применение со Static и без Free?

Добавлено: Вт фев 18, 2025 11:48
Loopback
Orion9 писал(а):Ну вот. А я-то думал, все мои проблемы уже решены, а тут с бубном прыгать надо )
Такова жизнь :)
Orion9 писал(а):Не уверен, что это правильно и будет работать на всех конфигурациях. Если есть лучший вариант, сообщите, пожалуйста.
Думаю, такой вариант может быть вполне работоспособным, только нужно его как-то ограничить нужным интерфейсом, CurrentBandWidth может и не на одном интерфейсе быть > 0.
Orion9 писал(а):Если есть лучший вариант, сообщите, пожалуйста.
Насчет лучший не знаю, можно, конечно и с имеющимися функциями написать, учитывая переполнение, но считаться трафик будет от запуска тотала.
Orion9 писал(а):И что касается переменной wq в данном примере, всё ли правильно? Допустимо такое применение со Static и без Free?
Да, вполне. В этом случае объект будет создан однократно и уничтожится при завершении скрипта.