MENU

实现托盘程序 | Golang

August 8, 2022 • Read: 436 • 学习

前言

因工作需要,使用go实现一些小功能,黑窗的形式有过于呆板,且容易误关闭,此前也尝试过讲go打包成dll,随后通过C#编写界面及托盘的方式来运行 | 相关代码

托盘

这里使用的托盘库是蓝灯维护的一个项目https://github.com/getlantern/systray,没错就是你知道的那个蓝灯

官方定义为:在通知区域中放置图标和菜单的跨平台库

简单介绍一下使用以及关于托盘图标避坑

  • 使用还是非常简单的, 仓库readme中有代码
func main() {
    systray.Run(onReady, onExit)
}

func onReady() {
    systray.SetIcon(icon.Data)
    systray.SetTitle("Awesome App")
    systray.SetTooltip("Pretty awesome超级棒")
    mQuit := systray.AddMenuItem("Quit", "Quit the whole app")

    // Sets the icon of a menu item. Only available on Mac and Windows.
    mQuit.SetIcon(icon.Data)
}

func onExit() {
    // clean up here
}

使用步骤也很简单

go install github.com/cratonica/2goarray@latest
2goarray ImgData resources < icon.ico > resources.go

随后调用此生成的[]byte即可

注意: 在macos下png, ico转换出来的[]byte都可以使用, 而在windows下只能使用ico转换出来的[]byte, 详情查看issue

拓展

echo IDI_ICON1 ICON "icon.ico" > .\resources\icon.rc
windres -o icon.syso .\resources\icon.rc
  • go在打包的时候避免生成调试的命令行窗口, 更多go build命令详解
go build -ldflags="-H windowsgui"
func checkSingleton() (windows.Handle, error) {
    path, err := os.Executable()
    if err != nil {
        return 0, err
    }
    hashName := md5.Sum([]byte(path))
    name, err := syscall.UTF16PtrFromString("Local\\" + hex.EncodeToString(hashName[:]))
    if err != nil {
        return 0, err
    }
    return windows.CreateMutex(nil, false, name)
}
本文作者:ZGGSONG
本文链接:https://www.zggsong.cn/archives/go_app_in_notification_area.html
版权声明:本站所有未注明转载的文章均为原创,并采用CC BY-NV-SA 4.0授权协议,转载请注明来源

Last Modified: August 19, 2022
Archives QR Code Tip
QR Code for this page
Tipping QR Code
Leave a Comment

已有 1 条评论
  1. 看完总结,小地鼠真可爱@(捂嘴笑)