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
|
||
}
|