Golang实现将消息打印到仅可最小化到托盘的弹出窗口

Golang实现将消息打印到仅可最小化到托盘的弹出窗口 假设有一个简单的应用程序,每隔1到10秒“打印”一次时间戳,总共10次,如下所示:

package main

import (
	"fmt"
	"time"
)

func main() {
	for i := 1; i <= 10; i++ {
		fmt.Println(time.Now().Format("2006-01-02T15:04:05"))
		time.Sleep(time.Duration(i) * time.Second)
	}
}

有没有办法让应用程序创建一个新的弹出窗口来显示时间戳?此外,这个窗口的标题栏不应该有任何最小化/最大化/关闭按钮,而应该有一个“最小化到托盘”的按钮。 有什么建议吗?


更多关于Golang实现将消息打印到仅可最小化到托盘的弹出窗口的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang实现将消息打印到仅可最小化到托盘的弹出窗口的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


要实现一个仅可最小化到系统托盘的弹出窗口来显示消息,可以使用fynesystray库。以下是一个示例代码,它创建一个无边框窗口,并在系统托盘中添加一个图标来控制窗口的显示和隐藏:

package main

import (
	"fmt"
	"time"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
	"github.com/getlantern/systray"
)

func main() {
	// 创建应用程序
	myApp := app.New()
	myWindow := myApp.NewWindow("Timestamp Display")

	// 设置窗口大小
	myWindow.Resize(fyne.NewSize(400, 300))

	// 移除窗口的标题栏按钮
	myWindow.SetCloseIntercept(func() {
		myWindow.Hide()
	})

	// 创建一个标签来显示时间戳
	label := widget.NewLabel("")
	content := container.NewVScroll(label)
	myWindow.SetContent(content)

	// 启动系统托盘
	go systray.Run(onReady(myWindow), onExit)

	// 在新的goroutine中更新时间戳
	go func() {
		for i := 1; i <= 10; i++ {
			timestamp := time.Now().Format("2006-01-02T15:04:05")
			fmt.Println(timestamp)

			// 更新窗口中的标签
			label.SetText(label.Text + timestamp + "\n")
			content.Refresh()

			time.Sleep(time.Duration(i) * time.Second)
		}
	}()

	myWindow.ShowAndRun()
}

func onReady(window fyne.Window) func() {
	return func() {
		systray.SetIcon(getIcon())
		systray.SetTitle("Timestamp App")
		systray.SetTooltip("Click to show/hide window")

		showWindow := systray.AddMenuItem("Show Window", "Show the timestamp window")
		hideWindow := systray.AddMenuItem("Hide Window", "Hide the timestamp window")
		systray.AddSeparator()
		quit := systray.AddMenuItem("Quit", "Quit the application")

		// 处理菜单项点击事件
		go func() {
			for {
				select {
				case <-showWindow.ClickedCh:
					window.Show()
				case <-hideWindow.ClickedCh:
					window.Hide()
				case <-quit.ClickedCh:
					systray.Quit()
					window.Close()
				}
			}
		}()
	}
}

func onExit() {
	// 清理代码可以放在这里
}

func getIcon() []byte {
	// 返回一个简单的图标字节数据
	// 这里使用一个1x1的透明像素作为占位符
	return []byte{
		0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D,
		0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
		0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4, 0x89, 0x00, 0x00, 0x00,
		0x0A, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9C, 0x63, 0x00, 0x01, 0x00, 0x00,
		0x05, 0x00, 0x01, 0x0D, 0x0A, 0x2D, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x49,
		0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82,
	}
}

这个示例使用了以下关键特性:

  1. 使用fyne创建GUI窗口,并通过SetCloseIntercept自定义关闭行为,将关闭操作改为隐藏窗口。
  2. 使用systray创建系统托盘图标和菜单,提供“显示窗口”、“隐藏窗口”和“退出”选项。
  3. 时间戳同时打印到控制台并更新到窗口的标签中。

运行前需要安装依赖:

go get fyne.io/fyne/v2
go get github.com/getlantern/systray

注意:getIcon函数中的图标数据是占位符,实际使用时需要替换为合适的图标数据。

回到顶部