1

Тема: AHK: Отображение загрузки процессора в заголовке окна

Есть скрипт Отображение загрузки процессора на кнопке Пуск
А как отобразить загрузку процессора например в заголовке WinActive( "ahk_class TTOTAL_CMD" ) ?

2 (изменено: creature.ws, 2012-10-29 05:42:35)

Re: AHK: Отображение загрузки процессора в заголовке окна

У вас этот скрипт работает? Если да — функция возвращающая уровень текущей загрузки называется GetCPULoad. А уж прикрутить её к таймеру, производящему замену заголовка нужного окна, дело не хитрое.

3 (изменено: HA3APET, 2012-08-21 11:16:57)

Re: AHK: Отображение загрузки процессора в заголовке окна

creature.ws, я почти ноль в скриптах для AutoHotkey. Если вас не затруднит, напишите пожалуйста рабочий скрипт для данной задачи.

4 (изменено: Irbis, 2012-08-21 16:29:27)

Re: AHK: Отображение загрузки процессора в заголовке окна

Собственно, на основе вышеупомянутого скрипта:

#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)
}

5

Re: AHK: Отображение загрузки процессора в заголовке окна

Irbis, спасибо. работает! Есть вопрос, а можно сменить тип поиска окна с поиска по классу на поиск по названию. Тоесть например, у меня в окне ТС надпись "Total Commander 8.01 - PowerUser". Я это название ввожу заместо ahk_class TTOTAL_CMD, заголовок меняется, но остаётся статическим, тоесть не показывает загрузку в реальном времени. Хотя #Persistent прописан, вроде он за постоянную перепрорисовку отвечает.

6

Re: AHK: Отображение загрузки процессора в заголовке окна

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
}

7

Re: AHK: Отображение загрузки процессора в заголовке окна

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%

Пытался сам разобраться, но знаний явно не хватает...

8 (изменено: creature.ws, 2012-10-29 05:41:05)

Re: AHK: Отображение загрузки процессора в заголовке окна

#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
}

9 (изменено: HA3APET, 2012-08-22 15:37:54)

Re: AHK: Отображение загрузки процессора в заголовке окна

creature.ws, всё отлично! Огромное спасибо. Ещё одна просьба. Можно ли формат времени поменять с HH:mm:ss на ddd dd MMM yyyy :: HH:mm:ss ?

10

Re: AHK: Отображение загрузки процессора в заголовке окна

Можно, заменить - на :: сможете?

11 (изменено: HA3APET, 2012-08-22 18:04:09)

Re: AHK: Отображение загрузки процессора в заголовке окна

это без проблем, а вот наоборот заменить :: на - не получается, видимо какой то конфликт...
Ради образовательных целей подскажите как)

12

Re: AHK: Отображение загрузки процессора в заголовке окна

Нет, не подскажу.

13

Re: AHK: Отображение загрузки процессора в заголовке окна

В итоге имею скрипт:

#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"

14

Re: AHK: Отображение загрузки процессора в заголовке окна

SetTitleMatchMode.

15

Re: AHK: Отображение загрузки процессора в заголовке окна

Я во всём этом ноль и из описания ничего не понял, хотя экспериментировал и пытался понять минут 40. Будьте любезны объясните мне поподробнее.

16

Re: AHK: Отображение загрузки процессора в заголовке окна


SetTitleMatchMode, MatchMode

Возможные значения MatchMode:


1: заголовок окна должен начинаться со значения, заданного в WinTitle 
2: заголовок окна должен содержать значение, заданное в WinTitle 
3: заголовок окна должен совпадать со значением, заданным в WinTitle

По умолчанию используется 1, а вам нужно 2.


SetTitleMatchMode, 2

17

Re: AHK: Отображение загрузки процессора в заголовке окна

Ура! Заработало)) Спасибо, запомнил. Теперь буду знать.

18 (изменено: Indomito, 2013-01-26 14:37:05)

Re: AHK: Отображение загрузки процессора в заголовке окна

А как же часики, тоже работают(я про формат)?
Правда, я не понял, что не работало в chm-файле всё подробно описано... вроде бы

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

19

Re: AHK: Отображение загрузки процессора в заголовке окна

Тот формат не заработал, ну и ладно)
Новый вопрос:
Скрипт:

#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%)- из-за этого название в заголовке окна дёргается.
Или может есть более красивый способ, без этих лишних ноликов в начале?

20

Re: AHK: Отображение загрузки процессора в заголовке окна

Вот так, наверно:


WinSetTitle, %  RegExReplace(t, "S)    .*%$")
. (isExit? "" : "    " time "    Загрузка ЦП: " SubStr("00" GetCPULoad() "%", -3))

21

Re: AHK: Отображение загрузки процессора в заголовке окна

Ура, работает. Класс! Спасибо!