使用go语言开发一个显示电池电量的工具

使用go语言开发一个显示电池电量的工具

November 5, 2023
后端开发, 系统工具
系统工具, Go语言

用着乞丐版的macbook,整天担心磁盘空间和内存不够用。今天突发奇想,想开发一个工具,可以实时显示电池电量、cpu使用率、内存使用率、磁盘使用率。

想干就干,利用ai+github,很快就找齐了相关的工具库。

  • 系统:mac os。
  • 语言:go语言。
  • 获取电池电量的库:battery
  • 获取cpu、内存、磁盘使用情况的库:gopsutil
  • 系统托盘程序库:systray

功能:获取电池电量、cpu使用率、内存使用率、磁盘使用率,并实时显示在系统托盘中(定时更新)。

效果图: 系统工具

代码如下:

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

仓库地址: https://git.gqnotes.com/guoqiang/mysystray