因工作需要,使用go实现一些小功能,黑窗的形式有过于呆板,且容易误关闭,此前也尝试过讲go打包成dll,随后通过C#编写界面及托盘的方式来运行 | 相关代码
这里使用的托盘库是蓝灯维护的一个项目https://github.com/getlantern/systray,没错就是你知道的那个蓝灯
官方定义为:在通知区域中放置图标和菜单的跨平台库
简单介绍一下使用以及关于托盘图标避坑
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
}
systray.SetIcon()
, 中的图标的二进制数据可使用第三方库将自己的图片来转换出来-https://github.com/cratonica/2goarray使用步骤也很简单
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 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授权协议,转载请注明来源