package main import ( "fmt" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/mem" "time" "github.com/distatus/battery" "github.com/getlantern/systray" ) func main() { // 1. 创建系统托盘 systray.Run(onReady, onExit) } var mQuit *systray.MenuItem var quitChans = make([]chan struct{}, 1) var menuDict = make(map[string]*systray.MenuItem) func onReady() { maps := getBatterStatus() sysinfo := getSystemInfo() systray.SetTitle("电池电量:" + maps["Capacity"]) menuDict["battery.current"] = systray.AddMenuItem("当前电量:"+maps["Current"], "") menuDict["battery.remain"] = systray.AddMenuItem("剩余容量:"+maps["Full"], "") menuDict["battery.design"] = systray.AddMenuItem("设计容量:"+maps["Design"], "") menuDict["system.cpu"] = systray.AddMenuItem("CPU使用率:"+sysinfo["cpu"], "") menuDict["system.memory"] = systray.AddMenuItem("内存使用率:"+sysinfo["memory"], "") menuDict["system.disk"] = systray.AddMenuItem("磁盘使用率:"+sysinfo["disk"], "") systray.AddSeparator() mQuit = systray.AddMenuItem("退出", "") go func() { // 2. 监听退出菜单事件 <-mQuit.ClickedCh // 3. 退出 systray.Quit() fmt.Println("Quit now...") }() go func() { ticker := time.NewTicker(10 * time.Second) for _ = range ticker.C { maps := getBatterStatus() sysinfo := getSystemInfo() systray.SetTitle("电池电量:" + maps["Capacity"]) menuDict["battery.current"].SetTitle("当前电量:" + maps["Current"]) menuDict["battery.remain"].SetTitle("剩余容量:" + maps["Full"]) menuDict["battery.design"].SetTitle("设计容量:" + maps["Design"]) menuDict["system.cpu"].SetTitle("CPU使用率:" + sysinfo["cpu"]) menuDict["system.memory"].SetTitle("内存使用率:" + sysinfo["memory"]) menuDict["system.disk"].SetTitle("磁盘使用率:" + sysinfo["disk"]) } }() } func onExit() { // 退出时清理 // systray.Quit() } func getBatterStatus() map[string]string { batteries, err := battery.GetAll() if err != nil { fmt.Println("Failed to get battery info:", err) return nil } maps := make(map[string]string) for _, bat := range batteries { maps["Capacity"] = fmt.Sprintf("%.2f%%", bat.Current/bat.Full*100) maps["Current"] = fmt.Sprintf("%.0f", bat.Current) maps["Full"] = fmt.Sprintf("%.0f", bat.Full) maps["Design"] = fmt.Sprintf("%.0f", bat.Design) break } return maps } // 获取cpu,内存,磁盘使用情况 func getSystemInfo() map[string]string { maps := make(map[string]string) // 获取 CPU 利用率 cpuInfo, _ := cpu.Percent(time.Second, false) maps["cpu"] = fmt.Sprintf("%.0f%%", cpuInfo[0]) // 获取内存使用率 memInfo, _ := mem.VirtualMemory() maps["memory"] = fmt.Sprintf("%.0f%%", memInfo.UsedPercent) // 获取磁盘使用率 diskInfo, _ := disk.Usage("/") maps["disk"] = fmt.Sprintf("%.0f%%", diskInfo.UsedPercent) return maps }