/* Output params (global variables) memoryAvailPhys memoryTotalPhys memoryUsedPhys */ #Requires AutoHotkey v2 #NoTrayIcon Persistent CoordMode 'ToolTip' SetTimer GetRamInfo.Bind(&memoryAvailPhys := 0, &memoryTotalPhys := 0, &memoryUsedPhys := 0), 1000 GetRamInfo(&memoryAvailPhys, &memoryTotalPhys, &memoryUsedPhys) { NumPut('UInt', 64, MEMORYSTATUSEX := Buffer(64, 0)) DllCall('GlobalMemoryStatusEx', 'Ptr', MEMORYSTATUSEX) memoryUsedPhys := NumGet(MEMORYSTATUSEX, 4, 'UInt') . ' %' memoryTotalPhys := ByteSizeConverter(NumGet(MEMORYSTATUSEX, 8, 'UInt64')) memoryAvailPhys := ByteSizeConverter(NumGet(MEMORYSTATUSEX, 16, 'UInt64')) /* ToolTip 'memoryUsedPhys: ' . memoryUsedPhys . '`n' . 'memoryTotalPhys: ' . memoryTotalPhys . '`n' . 'memoryAvailPhys: ' . memoryAvailPhys, 2, 2 */ } ByteSizeConverter(bytes) { bytes .= ' B' for v in ['KB', 'MB', 'GB', 'TB'] { if (f := RegExReplace(bytes, '[^\d.]')) >= 1024 { bytes := Format('{:.2f} ' . v, f / 1024) } } until f < 1024 return bytes }