2013-09-08 (Sun) [長年日記]

_ [ahk]CPU/メモリ使用率メータ

前に作ったCPUメータを AHK で書き直してみた。 付属の AHK2Exe で exe にして完璧。

合ってるのかどうかは知らんけど、forumから拾ってきたやつを動くようにして、

; SetTaskbarProgress  -  Requires Windows 7.
;
; pct    -  A number between 0 and 100 or a state value (see below).
; state  -  "N" (normal), "P" (paused), "E" (error) or "I" (indeterminate).
;           If omitted (and pct is a number), the state is not changed.
; hwnd   -  The ID of the window which owns the taskbar button.
;           If omitted, the Last Found Window is used.
;
SetTaskbarProgress(pct, state="", hwnd="")
{
    static tbl, s0:=0, sI:=1, sN:=2, sE:=4, sP:=8
    ; Create a TaskbarList object with ITaskbarList3 interface:
    if !tbl
       tbl := ComObjCreate("{56FDF344-FD6D-11d0-958A-006097C9A090}","{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}")
    if hwnd =
        hwnd := WinExist()
    if pct is not number
        state := pct, pct := ""
    else if (pct = 0 && state="")
        state := 0, pct := ""
    if state in 0,I,N,E,P   ; ITaskbarList3::SetProgressState
        DllCall(NumGet(NumGet(tbl+0)+10*A_PtrSize), "ptr", tbl, "uint", hwnd, "uint", s%state%)
    if pct !=               ; ITaskbarList3::SetProgressValue
        DllCall(NumGet(NumGet(tbl+0)+9*A_PtrSize), "ptr", tbl, "uint", hwnd, "int64", pct*10, "int64", 1000)
}

CPU なら 「流行らせるページ」のサンプルからパクってきてこう。

Gui, Show
Gui, +LastFound
SetTaskbarProgress(0, "N")
DllCall("GetSystemTimes","int64p",lastTimeIdle,"int64p",lastTimeKernel,"int64p",lastTimeUser)
Loop
{
  Sleep 500
  DllCall("GetSystemTimes","int64p",TimeIdle,"int64p",TimeKernel,"int64p",TimeUser)
  cpu:=100-100*(TimeIdle-lastTimeIdle)/(TimeUser-lastTimeUser+TimeKernel-lastTimeKernel)
  SetTaskbarProgress(cpu)
  lastTimeIdle=%TimeIdle%
  lastTimeKernel=%TimeKernel%
  lastTimeUser=%TimeUser%
}
GuiClose:
GuiEscape:
ExitApp

メモリは簡単にできる。これは forum からパクった。memst+4 っていうのが何なのかは調べてない。

Gui, Show
Gui, +LastFound
SetTaskbarProgress(0, "P")
VarSetCapacity(memst, 100)
Loop
{
  Sleep 500
  DllCall("GlobalMemoryStatus","uint",&memst)
  mem:=*(&memst+4)
  SetTaskbarProgress(mem)
}
GuiClose:
GuiEscape:
ExitApp

まあ動いてるからいいかな。

本日のツッコミ(全3件) [ツッコミを入れる]
_ tamo (2013-09-08 (Sun) 14:50)

MEMORYSTATUS 構造体の最初が <br>DWORD dwLength; <br>DWORD dwMemoryLoad; <br>だから DWORD ひとつぶんが +4 なのかな。 <br>DWORD が 32bit なのは OS が 32bit でも 64bit でも不変みたい? <br> <br>あと今時は GlobalMemoryStatus に Ex を付けたほうが良さそう。 <br>EX になっても VarSetCapacity は 100 あれば足りるべ。

_ tamo (2013-09-08 (Sun) 16:38)

EX にして NumGet するときは uint 指定しないとだめっぽい。 <br>VarSetCapacity(memst, 64, 0) <br>NumPut(64,memst,0,"uint") <br>Loop <br>{ <br> Sleep 500 <br> DllCall("GlobalMemoryStatusEx","uint",&memst) <br> mem:=NumGet(memst,4,"uint") <br> SetTaskbarProgress(mem) <br>} <br>

_ tamo (2013-09-10 (Tue) 15:32)

ネットワークの活発さを見るにはこんな感じかな。datagram というのがどういうことなのかは調べてないし、In と Fw と Out がこれで本当に ok なのかもわからない。 <br>そういや SetTaskbarProgress は 0 だとリセットされるので、メモリのほうも毎回 "P" 指定したほうがいいんじゃないかな。 <br> <br>SetTaskbarProgress(0, "N") <br>IPHLP:=DllCall("LoadLibrary","str","iphlpapi.dll") <br>VarSetCapacity(pStats, 100, 0) ; enough for 23 DWORDs? <br>;AF_INET=2, AF_INET6=23 http://msdn.microsoft.com/en-us/library/ms740506(VS.85).aspx <br>DllCall("iphlpapi.dll\GetIpStatisticsEx","uint",&pStats,"uint",2) <br>;http://msdn.microsoft.com/en-us/library/windows/desktop/aa366871(v=vs.85).aspx <br>InRcv:=NumGet(pStats,4*2,"uint") <br>Fw:=NumGet(pStats,4*5,"uint") <br>OutReq:=NumGet(pStats,4*9,"uint") <br>lastAll:=InRcv+Fw+OutReq <br>Loop <br>{ <br> Sleep 500 <br> DllCall("iphlpapi.dll\GetIpStatisticsEx","uint",&pStats,"uint",2) <br> InRcv:=NumGet(pStats,4*2,"uint") <br> Fw:=NumGet(pStats,4*5,"uint") <br> OutReq:=NumGet(pStats,4*9,"uint") <br> All:=InRcv+Fw+OutReq <br> Diff:=All-lastAll <br> ;should convert Diff from datagram to percentage but <br> SetTaskbarProgress(Diff, "N") <br> lastAll:=All <br>} <br>GuiClose: <br>GuiEscape: <br>DllCall("FreeLibrary","uint",IPHLP) <br>ExitApp <br>


«前の日記(2013-03-02 (Sat)) 最新 次の日記(2013-10-11 (Fri))»