107 lines
2.9 KiB
Go
107 lines
2.9 KiB
Go
|
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
|
|||
|
}
|