Orion9

|
Posted: Thu Jan 15, 2026 20:24 Post subject: |
|
|
FallenAngel
Еще раз просмотрел и обновил InfoHeader.aucfg
Добавил некоторые проверки и изменил меню заголовка. Реорганизовать пункты можно по-разному, но пока остановился на таком варианте.
Loopback на заметку: запись ниже не выгружает иконку из-за расширения .cpl:
| Code: | em_aucmd "timedate.cpl" ShellExec rundll32.exe |
Можно такое учесть для апплетов?
FallenAngel
В меню теперь можно включить или отключить отображение погоды: так удобнее, чем вручную править файл конфигурации.
Файл пользователя можно создать автоматически, если он отсутствует. Для этого используется шаблон:
| Code: | [Wttr]
Name=Погода:
Interval=1800
Url=https://wttr.in/47.37,8.55?format=%t
Hint=https://wttr.in/47.37,8.55?T |
Но при желании его можно изменить в скрипте.
Добавил переменную gTitleRound для указания количества знаков после точки у сетевого трафика. Раньше округлялось до одного знака, что выглядело несколько статично, на мой взгляд, но можно вернуть прежнее значение.
 InfoHeader.aucfg | Code: | Sleep(200)
# наведение на заголовок
ControlSetHint /F /D:350 /H:2 0 "InfoHeaderHint"
# правый клик
ControlSetMouseAction /R /H:2 0 "InfoHeaderMenu"
# Shift + клик по заголовку
ControlSetMouseAction /L /K:S /H:2 0 "ToggleInfoHeader"
Global gTitle = WinGetText(), gInfoHeader = gTitle, gShowTitle = 1, gTitleThread = 0, gTitleRound = 2
Global gWttr = 1, gWttrUrl, gWttrHint, gWttrName, gWttrInterval = 3600
Global gWttrSec = 0, gWttrData, gWttrTip = "", gWttrFile = TEMP & "\wttr.txt", gWttrDataUpdate = 0
Global gWttrIni = COMMANDER_PATH & "\Ini\Header.ini"
Global gWttrIniApp = GetKnownFolderPath("LocalAppData") & "\GHISLER\Wttr.ini"
# запуск
LaunchInfoHeader()
# WM_WINDOWPOSCHANGING
# реагирование заголовка на изменение позиции окна
SetMessageAction 70 "SetInfoHeader"
Func ToggleInfoHeader()
# переключение переменной
gShowTitle = Not gShowTitle
# запись нового значения в Header.ini
IniWrite %gWttrIni% "Title" "ShowTitle" %"gShowTitle"
Sleep(100)
LaunchInfoHeader()
EndFunc
Func SetInfoHeader()
WinSetText(gShowTitle ? gInfoHeader : gTitle)
EndFunc
Func LaunchInfoHeader()
# чтение ключа
IniRead gShowTitle %gWttrIni% "Title" "ShowTitle" 1
# запуск заголовка, если он еще не запущен
If gShowTitle And Not gTitleThread Then
gInfoHeader = gTitle & ' ' & "Booting..."
WinSetText(gInfoHeader)
# подготовка конфигурации
InfoHeaderReadIni()
Sleep(200)
RunThread InfoHeader
EndIf
EndFunc
Func InfoHeaderReadIni()
Local sWttrIni = gWttrIni, sUrl
# чтение из Header.ini
IniRead gWttr %gWttrIni% "Title" "Wttr" 1
IniRead sUrl %sWttrIni% "Wttr" "Url" ""
# чтение из AppData\Wttr.ini
If FileExist(gWttrIniApp) Then
sWttrIni = gWttrIniApp
EndIf
IniRead gWttrUrl %sWttrIni% "Wttr" "Url" ""
IniRead gWttrHint %sWttrIni% "Wttr" "Hint" ""
IniRead gWttrName %sWttrIni% "Wttr" "Name" ""
IniRead gWttrInterval %sWttrIni% "Wttr" "Interval" 3600
# нет данных в AppData
# откат к значению из Header.ini
If gWttrUrl = "" Then gWttrUrl = sUrl
# проверка корректности значения интервала
If Not IsInt(gWttrInterval) Then gWttrInterval = 0
if gWttrInterval < 900 Then gWttrInterval = 900
# по умолчанию интервал считается законченным
gWttrSec = gWttrInterval
# проверка существования локального файла
If FileExist(gWttrFile) Then
# количество секунд с последнего обновления
gWttrSec = Round((Now() - FileGetTime(gWttrFile)) / 10000000)
# прошло меньше секунд, чем отведенный интервал
If gWttrSec < gWttrInterval Then gWttrData = StrTrim(FileRead(gWttrFile))
If gWttrName <> "" Then gWttrData = gWttrName & " " & gWttrData
EndIf
EndFunc
Func InfoHeader
Local nRecvSpeed, nSendSpeed, T1, lst = List(" | "," / ","—"," \ ")
Static c = 0
# поток запущен
gTitleThread = 1
# выполнять пока gShowTitle = true
While gShowTitle
T1 = GetUptime()
# погода включена и требуется обновление
If gWttr And gWttrSec >= gWttrInterval Then
# сброс счетчика
gWttrSec = 0
# запуск обновления в отдельном потоке
RunThread "GetWttrData"
EndIf
GetNetSpeed(nRecvSpeed, nSendSpeed)
# идет процесс обновления
If gWttrDataUpdate Then
c += 1
If c > lst.Count Then c = 1
#gWttrData = Weather updating: " & lst[c-1]
gWttrData = "Weather updating: " & gWttrSec & ' sec.'
EndIf
gInfoHeader = gTitle & ' ' & (gWttr ? gWttrData & ' ' : '') & Date("d MMMM, ddd") & '. CPU: ' & StrFormat("%02d", GetCPUUsage()) & '% RAM: ' & GetMemStats() & '% NET: ↓ ' & Round(nRecvSpeed / 1000, gTitleRound) & ' ↑ ' & Round(nSendSpeed / 1000, gTitleRound) & ' mb/s'
WinSetText(gInfoHeader)
# разбитие секунды на более мелкие интервалы
# для лучшего отклика при изменении переменной
While GetUptime() < T1 + 1000
If Not gShowTitle Then Break
Sleep(50)
Wend
# увеличение счетчика до следующего обновления погоды
gWttrSec += 1
Wend
Free(lst)
# поток остановлен
gTitleThread = 0
# обновление заголовка
SetInfoHeader()
EndFunc
Func GetWttrData()
Local msg, sData
# флаг операции
gWttrDataUpdate = true
gWttrTip = "Соединение..."
# загрузка файла в тихом режиме
Local code = WinInetDownloadFile(gWttrUrl, gWttrFile, 1)
# снятие флага операции для заголовка
gWttrDataUpdate = false
If code = -1 Then
msg = "WinInet Error: " & code
ElseIf code > 0 Then
msg = "WinInet Error: " & code
gWttrTip = msg & auCRLF & GetWinInetError(code)
EndIf
If code = 0 Then
gWttrTip = "Обновлено"
msg = FileRead(gWttrFile)
If ERROR = 1 Then msg = "FileRead Error: "
EndIf
sData = StrTrim(msg)
gWttrData = sData
# добавление имени местоположения если указано
If code = 0 And gWttrName <> "" Then gWttrData = gWttrName & " " & sData
If code = 0 Then
gWttrSec = 0
Else
# повтор через 30 секунд
gWttrSec = gWttrInterval - 30
EndIf
# загрузка данных для подсказки в тихом режиме
code = WinInetDownloadFile(gWttrHint, TEMP & "\wttr.html", 1)
If code <> 0 Then
msg = "WinInet Error: " & code
gWttrTip &= auCRLF & "Хинт: " & msg & auCRLF & GetWinInetError(code)
EndIf
EndFunc
Func InfoHeaderHint()
Local txt, file = TEMP & "\wttr.html"
If Not IsPressed (0x11) Then
If Not gShowTitle Then Return "Заголовок выключен"
txt &= "Работает" & auCRLF
txt &= "Погода " & (gWttr? "включена" : "отключена") & auCRLF
If gWttr Then
txt &= "Интервал: " & gWttrInterval & " сек." & auCRLF
txt &= "Обновление через: " & gWttrInterval - gWttrSec & " сек." & auCRLF
If gWttrTip <> "" Then txt &= "Статус: " & gWttrTip & auCRLF
EndIf
If IsPressed (0x12) Then
txt &= "Файлы конфигурации:" & auCRLF
txt &= gWttrIni & auCRLF
txt &= gWttrIniApp & auCRLF
txt &= "Временные файлы:" & auCRLF
txt &= "Файл от " & Date('', gWttrFile) & ' ' & Time('', gWttrFile) & " "
txt &= gWttrFile & auCRLF
txt &= "Файл от " & Date('', file) & ' ' & Time('', file) & " "
txt &= file & auCRLF
EndIf
Return StrTrim(txt)
Endif
txt = FileRead(file)
If ERROR = 1 Then Return "Ошибка чтения " & file
# стиль подсказки
SetHintParam("csh", "Font", 10, "Consolas")
SetHintParam("csh", "BackColor", 0x001C1C1C)
SetHintParam("csh", "Text", 0xF9F9F9)
# извлечение текста из html
txt = StrReplace(txt, '"', '"')
Static lst = List()
lst.Count = 0
lst.Text = RegExpGet(txt, '<pre>(.*?)</pre>', "$1")
For i = 0 To lst.Count - 1
If StrLen(lst[i]) > 125 Then lst[i] = StrLeft(lst[i], 122) & ".."
Next
# вернуть предыдущий стиль через 1 сек.
RunThread InfoHeaderHintReload
If lst.Count = 0 Then Return "Файл не содержит данных " & file
Return lst.Text
EndFunc
Func InfoHeaderHintReload()
Sleep(1000)
SetHintParam("sh", "Reload")
SetHintParam("csh", "Reload")
EndFunc
Func InfoHeaderMenu()
ShowPopupMenu /D /F "InfoHeaderCreateMenu"
EndFunc
Func InfoHeaderCreateMenu()
Local txt
txt &= 'MENUITEM "Включить", em_aucmd "%COMMANDER_EXE%,37" InfoHeaderStart' & auCRLF
txt &= 'MENUITEM "Выключить", em_aucmd "%COMMANDER_EXE%,36" InfoHeaderStop' & auCRLF
txt &= 'MENUITEM "Обновить погоду", em_aucmd "shell32.dll,13" InfoHeaderUpdate' & auCRLF
txt &= 'MENUITEM SEPARATOR' & auCRLF
txt &= 'POPUP "Заголовок"' & auCRLF
txt &= 'MENUITEM "Отображать погоду", em_aucmd -1 InfoHeaderWttr 1' & auCRLF
txt &= 'MENUITEM "Не отображать погоду", em_aucmd -1 InfoHeaderWttr 0' & auCRLF
txt &= 'END_POPUP' & auCRLF
txt &= 'MENUITEM "Настройки...", em_aucmd "imageres.dll,62" InfoHeaderEditIni' & auCRLF
txt &= 'MENUITEM "Пользователь...", em_aucmd -1 InfoHeaderEditIniApp' & auCRLF
txt &= 'MENUITEM SEPARATOR' & auCRLF
txt &= 'POPUP "Перейти"' & auCRLF
txt &= 'MENUITEM "Перейти к Wttr.ini", em_aucmd "imageres.dll,62" InfoHeaderGotoIniApp' & auCRLF
txt &= 'MENUITEM "Перейти к Wttr.txt", em_aucmd -1 InfoHeaderGotoTemp "Wttr.txt"' & auCRLF
txt &= 'MENUITEM "Перейти к Wttr.html", em_aucmd -1 InfoHeaderGotoTemp "Wttr.html"' & auCRLF
txt &= 'MENUITEM SEPARATOR' & auCRLF
txt &= 'MENUITEM "Перейти к Header.ini", em_aucmd "imageres.dll,62" InfoHeaderGotoIni' & auCRLF
txt &= 'END_POPUP' & auCRLF
txt &= 'MENUITEM "Даты и время", em_aucmd "timedate.cpl" ShellExec rundll32.exe "shell32.dll,Control_RunDLL timedate.cpl"' & auCRLF
Return txt
EndFunc
Func InfoHeaderStart()
# запись значения в Header.ini
IniWrite %gWttrIni% "Title" "ShowTitle" 1
Sleep(100)
LaunchInfoHeader()
EndFunc
Func InfoHeaderStop()
IniWrite %gWttrIni% "Title" "ShowTitle" 0
Sleep(100)
LaunchInfoHeader()
EndFunc
Func InfoHeaderUpdate()
If Not gWttr Then
ShowHint("Погода выключена")
Return
EndIf
# обновление через 1 сек.
gWttrSec = gWttrInterval - 1
EndFunc
Func InfoHeaderWttr(Value)
IniWrite %gWttrIni% "Title" "Wttr" %"Value"
gWttr = Value
EndFunc
Func InfoHeaderEditIni()
If FileExist(gWttrIni) Then
ShellExec(gWttrIni)
Else
MsgBox("Файл не существует " & gWttrIni, "Autorun", 16)
EndIf
EndFunc
Func InfoHeaderGotoIni()
CommandExec("~/CD:S", gWttrIni)
EndFunc
Func InfoHeaderEditIniApp()
If FileExist(gWttrIniApp) Then
ShellExec(gWttrIniApp)
Else
MsgBox("Файл пользователя не существует " & gWttrIniApp & auCRLF & auCRLF & _
"Создать новый?", "Autorun", 3+0+32)
If EXTENDED <> 6 Then Return
Local txt = "[Wttr]" & auCRLF & _
"Name=Погода:" & auCRLF & _
"Interval=1800" & auCRLF & _
"Url=https://wttr.in/47.37,8.55?format=%t" & auCRLF & _
"Hint=https://wttr.in/47.37,8.55?T"
FileWrite(gWttrIniApp, txt, "ANSI")
Sleep(100)
If FileExist(gWttrIniApp) Then ShellExec(gWttrIniApp)
EndIf
EndFunc
Func InfoHeaderGotoIniApp()
CommandExec("~/CD:S", gWttrIniApp)
EndFunc
Func InfoHeaderGotoTemp(Filename)
Local sFile = TEMP & "\" & Filename
If FileExist(sFile) Then
CommandExec("~/CD:S", sFile)
Else
MsgBox("Файл не существует " & sFile, "Autorun", 16)
EndIf
EndFunc
Func GetNetSpeed(ByRef nRecvSpeed, ByRef nSendSpeed)
Static nIntfIdx = GetNetInterface()
If nIntfIdx = -1 Then Return
Static nPrevRecv = GetNetInterfaceInfo(nIntfIdx, 'Recv')
Static nPrevSend = GetNetInterfaceInfo(nIntfIdx, 'Sent')
Static nPrevTime = GetUptime()
Local nRecv = GetNetInterfaceInfo(nIntfIdx, 'Recv')
Local nSend = GetNetInterfaceInfo(nIntfIdx, 'Sent')
Local nTime = GetUptime()
Local nTimeDiff = nTime - nPrevTime
nRecvSpeed = Round(Abs(nRecv - nPrevRecv) / nTimeDiff)
nSendSpeed = Round(Abs(nSend - nPrevSend) / nTimeDiff)
nPrevRecv = nRecv
nPrevSend = nSend
nPrevTime = nTime
EndFunc |
Сервер работает плохо. Пару раз во временном каталоге сохранялся недокаченный на несколькой килобайт файл. Поскольку закрывающий тег </pre> в таком html обрезан, регулярное выражение не может вернуть текст. В таком случае вместо подсказки будет сообщение, что файл не содержит данных. Чтобы подсказка заработала необходимо еще раз обновить погоду и дождаться полной загрузки файла. |
|