Тема: AHK: Отображение загрузки процессора в заголовке окна
Есть скрипт Отображение загрузки процессора на кнопке Пуск
А как отобразить загрузку процессора например в заголовке WinActive( "ahk_class TTOTAL_CMD" ) ?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть скрипт Отображение загрузки процессора на кнопке Пуск
А как отобразить загрузку процессора например в заголовке WinActive( "ahk_class TTOTAL_CMD" ) ?
У вас этот скрипт работает? Если да — функция возвращающая уровень текущей загрузки называется GetCPULoad. А уж прикрутить её к таймеру, производящему замену заголовка нужного окна, дело не хитрое.
creature.ws, я почти ноль в скриптах для AutoHotkey. Если вас не затруднит, напишите пожалуйста рабочий скрипт для данной задачи.
Собственно, на основе вышеупомянутого скрипта:
#Persistent
Win = ahk_class TTOTAL_CMD
; Win = A ; для активного окна
EnvGet, NumCPU, NUMBER_OF_PROCESSORS ; Добавлено.
SetFormat, float, 2
VarSetCapacity(IdleTicks, 8)
SetTimer, CheckCPULoad, 1000
return
CheckCPULoad:
if WinExist(Win)
{
WinGetTitle, t
t := "'" GetCPULoad() "%' " SubStr(t, (Pos := InStr(t, "`%'")) ? Pos+3 : 1)
WinSetTitle, %t%
}
return
GetCPULoad()
{
Global
SetBatchLines, -1
IdleTime0 = %IdleTime% ; Save previous values
Tick0 = %Tick%
DllCall("kernel32.dll\GetSystemTimes", "uint",&IdleTicks, "uint",0, "uint",0)
IdleTime := *(&IdleTicks)
Loop 7 ; Ticks when Windows was idle
IdleTime += *( &IdleTicks + A_Index ) << ( 8 * A_Index )
Tick := A_TickCount ; Ticks all together
load := 100 - 0.01*(IdleTime - IdleTime0)/NumCPU/(Tick - Tick0) ; Изменено.
Return, abs(load)
}
Irbis, спасибо. работает! Есть вопрос, а можно сменить тип поиска окна с поиска по классу на поиск по названию. Тоесть например, у меня в окне ТС надпись "Total Commander 8.01 - PowerUser". Я это название ввожу заместо ahk_class TTOTAL_CMD, заголовок меняется, но остаётся статическим, тоесть не показывает загрузку в реальном времени. Хотя #Persistent прописан, вроде он за постоянную перепрорисовку отвечает.
SetTitleMatchMode переключить в режим 2 — будет работать.
Или так:
#Persistent
#NoEnv
OnExit, ExitSub
win := "Total Commander 8.01 - PowerUser"
SetTimer, CheckCPULoad, 1000
return
CheckCPULoad:
SetBatchLines, -1
if WinExist(win)
{
WinGetTitle, t
WinSetTitle, % RegExReplace(t, "S) :: CPU Usage: \d{0,3}%") . (isExit? "" : " :: CPU Usage: " GetCPULoad() "%")
}
return
ExitSub:
isExit := true
SetTimer, CheckCPULoad, off
Gosub, CheckCPULoad
ExitApp
GetCPULoad()
{
static priorIdleTime, priorTickCount, idleTicks, numCPU
If !numCPU
EnvGet, numCPU, NUMBER_OF_PROCESSORS
If !idleTicks
VarSetCapacity(idleTicks, 8)
DllCall("GetSystemTimes", "UInt", &idleTicks, "UInt", 0, "UInt", 0), idleTime := *(&idleTicks)
Loop 7
IdleTime += *(&idleTicks + A_Index) << (8 * A_Index)
return Round(Abs(100 - 0.01*(idleTime - priorIdleTime)/numCPU/(A_TickCount - priorTickCount)))
, priorTickCount := A_TickCount, priorIdleTime := idleTime
}
creature.ws, спасибо, работает! А можно объединить вот с этим скриптом, что бы и загрузка CPU показывалась и часики?
#SingleInstance ignore
#Persistent
#NoTrayIcon
SetTimer subTimer, 250
subTimer:
WinWaitActive, Total Commander 8.01 - PowerUser
FormatTime, time,, ddd dd MMM yyyy - HH:mm:ss
WinSetTitle Total Commander 8.01 - PowerUser - %time%
Пытался сам разобраться, но знаний явно не хватает...
#Persistent
#NoEnv
OnExit, ExitSub
;win := "Total Commander 8.01 - PowerUser"
win := "Untitled - Notepad"
SetTimer, SetTitle, 1000
return
SetTitle:
SetBatchLines, -1
if WinExist(win) {
WinGetTitle, t
StringReplace, t, t, %priorAdd%
FormatTime, time,, ddd dd MMM yyyy - HH:mm:ss
WinSetTitle, % t . (isExit? "" : priorAdd := " - " . time . " - CPU Usage: " . GetCPULoad() . "%")
}
return
ExitSub:
isExit := true
SetTimer, SetTitle, off
Gosub, SetTitle
ExitApp
GetCPULoad()
{
static priorIdleTime, priorTickCount
static numCPU := EnvGet("NUMBER_OF_PROCESSORS")
VarSetCapacity(idleTime, 8, 0)
, DllCall("GetSystemTimes", "UInt", &idleTime, "UInt", 0, "UInt", 0)
, idleTime := NumGet(idleTime)
, load := Round(Abs(100 - 0.01*(idleTime - priorIdleTime)/numCPU/(A_TickCount - priorTickCount)))
, priorTickCount := A_TickCount
, priorIdleTime := idleTime
return load
}
EnvGet(var) {
EnvGet, var, %var%
return var
}
creature.ws, всё отлично! Огромное спасибо. Ещё одна просьба. Можно ли формат времени поменять с HH:mm:ss на ddd dd MMM yyyy :: HH:mm:ss ?
Можно, заменить - на :: сможете?
это без проблем, а вот наоборот заменить :: на - не получается, видимо какой то конфликт...
Ради образовательных целей подскажите как)
Нет, не подскажу.
В итоге имею скрипт:
#SingleInstance ignore
#Persistent
#NoTrayIcon
#NoEnv
OnExit, ExitSub
win := "Total Commander 8.01 - PowerUser v61"
SetTimer, CheckCPULoad, 500
return
CheckCPULoad:
SetBatchLines, -1
if WinExist(win)
{
WinGetTitle, t
FormatTime, time,, ddd dd MMM yyyy HH:mm:ss
WinSetTitle, % RegExReplace(t, "S) .*%$")
. (isExit? "" : " " time " Загрузка ЦП: " GetCPULoad() "%")
}
return
ExitSub:
isExit := true
SetTimer, CheckCPULoad, off
Gosub, CheckCPULoad
ExitApp
GetCPULoad()
{
static priorIdleTime, priorTickCount, idleTicks, numCPU
If !numCPU
EnvGet, numCPU, NUMBER_OF_PROCESSORS
If !idleTicks
VarSetCapacity(idleTicks, 8)
DllCall("GetSystemTimes", "UInt", &idleTicks, "UInt", 0, "UInt", 0), idleTime := *(&idleTicks)
Loop 7
IdleTime += *(&idleTicks + A_Index) << (8 * A_Index)
return Round(Abs(100 - 0.01*(idleTime - priorIdleTime)/numCPU/(A_TickCount - priorTickCount)))
, priorTickCount := A_TickCount, priorIdleTime := idleTime
}
То есть ищется заголовок окна с названием "Total Commander 8.01 - PowerUser v61", а как сделать так что бы искалось окно, где в заголовке есть эта фраза по мимо других? Что бы например находилось и "X^ Total Commander 8.01 - PowerUser v61"
Я во всём этом ноль и из описания ничего не понял, хотя экспериментировал и пытался понять минут 40. Будьте любезны объясните мне поподробнее.
SetTitleMatchMode, MatchMode
Возможные значения MatchMode:
1: заголовок окна должен начинаться со значения, заданного в WinTitle
2: заголовок окна должен содержать значение, заданное в WinTitle
3: заголовок окна должен совпадать со значением, заданным в WinTitle
По умолчанию используется 1, а вам нужно 2.
SetTitleMatchMode, 2
Ура! Заработало)) Спасибо, запомнил. Теперь буду знать.
А как же часики, тоже работают(я про формат)?
Правда, я не понял, что не работало в chm-файле всё подробно описано... вроде бы
Тот формат не заработал, ну и ладно)
Новый вопрос:
Скрипт:
#SingleInstance ignore
#Persistent
#NoTrayIcon
#NoEnv
OnExit, ExitSub
SetTitleMatchMode, 2
win := "Total Commander 8.01 - PowerUser v62"
SetTimer, CheckCPULoad, 500
return
CheckCPULoad:
SetBatchLines, -1
if WinExist(win)
{
WinGetTitle, t
FormatTime, time,, ddd dd MMM yyyy HH:mm:ss
WinSetTitle, % RegExReplace(t, "S) .*%$")
. (isExit? "" : " " time " Загрузка ЦП: " GetCPULoad() "%")
}
return
ExitSub:
isExit := true
SetTimer, CheckCPULoad, off
Gosub, CheckCPULoad
ExitApp
GetCPULoad()
{
static priorIdleTime, priorTickCount, idleTicks, numCPU
If !numCPU
EnvGet, numCPU, NUMBER_OF_PROCESSORS
If !idleTicks
VarSetCapacity(idleTicks, 8)
DllCall("GetSystemTimes", "UInt", &idleTicks, "UInt", 0, "UInt", 0), idleTime := *(&idleTicks)
Loop 7
IdleTime += *(&idleTicks + A_Index) << (8 * A_Index)
return Round(Abs(100 - 0.01*(idleTime - priorIdleTime)/numCPU/(A_TickCount - priorTickCount)))
, priorTickCount := A_TickCount, priorIdleTime := idleTime
}
Как сделать так, что бы загрузка процессора отображалась в формате 000% - 001% - 050% - 100%, а то в Windows 8 название окна централизируется в заголовке. А так как у нас загрузка процессора - это то один символ, то два, и иногда три (при 100%)- из-за этого название в заголовке окна дёргается.
Или может есть более красивый способ, без этих лишних ноликов в начале?
Вот так, наверно:
WinSetTitle, % RegExReplace(t, "S) .*%$")
. (isExit? "" : " " time " Загрузка ЦП: " SubStr("00" GetCPULoad() "%", -3))
Ура, работает. Класс! Спасибо!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться