前に作った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
まあ動いてるからいいかな。
MEMORYSTATUS 構造体の最初が <br>DWORD dwLength; <br>DWORD dwMemoryLoad; <br>だから DWORD ひとつぶんが +4 なのかな。 <br>DWORD が 32bit なのは OS が 32bit でも 64bit でも不変みたい? <br> <br>あと今時は GlobalMemoryStatus に Ex を付けたほうが良さそう。 <br>EX になっても VarSetCapacity は 100 あれば足りるべ。
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>
ネットワークの活発さを見るにはこんな感じかな。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>