mysystray/main.go

107 lines
2.9 KiB
Go
Raw Permalink Normal View History

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
}