;--------------------------------------------------------------------------------------------------------------- ; CHANGELOG: ; ; Dec 16 2021: Initial release by Glisense ltd ; ; Current script is designed for use together with Keyboard Extension® (https://keyboardextension.com) ; ; For the latest version, description and licensing terms go to https://keyboardextension.com/plugins/6f18222a ; ;--------------------------------------------------------------------------------------------------------------- #NoEnv ; Avoid checking empty variables if they are environment variables #NoTrayIcon ; Hide tray icon #Persistent ; Keep the script permanently running until it gets terminated CoordMode, ToolTip SetBatchLines, -1 global Downloaded, Uploaded, DownloadPerSec, UploadPerSec ; output global variables UpdateTraffic() SetTimer, UpdateTraffic, 1000 Return UpdateTraffic() { static dnOld, upOld, IsSet, TrInfo, timeOld if !IsSet { IsSet := true TrInfo := new TrafficInfo data := TrInfo.GetInfo() dnOld := data.dn upOld := data.up timeOld := A_TickCount Return } data := TrInfo.GetInfo() dnNew := data.dn upNew := data.up timeNew := A_TickCount elapsedSec := (timeNew - timeOld)/1000 dnRate := Round( (dnNew - dnOld) / elapsedSec ) upRate := Round( (upNew - upOld) / elapsedSec ) timeOld := timeNew dnOld := dnNew upOld := upNew Downloaded := TransformValue(dnNew) Uploaded := TransformValue(upNew) DownloadPerSec := TransformValue(dnRate) . "ps" UploadPerSec := TransformValue(upRate) . "ps" /* ToolTip, % "Downloaded: " . Downloaded . "`n" . "Uploaded: " . Uploaded . "`n" . "DownloadPerSec: " . DownloadPerSec . "`n" . "UploadPerSec: " . UploadPerSec */ } TransformValue(value) { for k, v in ["KB", "MB", "GB", "TB"] { if RegExReplace(value, "[^\d.]") >= 1024 value := Format("{:.2f} " . v, RegExReplace(value, "[^\d.]")/1024) } until value < 1024 Return value } class TrafficInfo { __New() { static MIB_IF_ROW2 this.hModule := DllCall("LoadLibrary", Str, "Iphlpapi.dll", Ptr) VarSetCapacity(MIB_IF_ROW2, 1352, 0) this.pData := &MIB_IF_ROW2 DllCall("iphlpapi\GetBestInterface", Ptr, 0, PtrP, IfIndex) NumPut(IfIndex, this.pData + 8) } __Get(key) { if key in dn,up Return NumGet(this.pData + (key = "dn" ? 1256 : 1320), "Int64") } __Delete() { DllCall("FreeLibrary", Ptr, this.hModule) } GetInfo() { DllCall("iphlpapi\GetIfEntry2", Ptr, this.pData) Return { dn: this.dn, up: this.up } } }