golang 带托盘的 http server启动关闭服务

来源:互联网 发布:ecshop分销源码下载 编辑:程序博客网 时间:2024/05/17 20:26
// 程序和托盘图标
rsrc -manifest main.manifest -o rsrc.syso -ico main.ico
// 优雅关闭http

github.com/braintree/manners

//展示






package mainimport ("fmt""log""net/http""github.com/braintree/manners""github.com/lxn/walk")func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])}type MyWindow struct {*walk.MainWindowni *walk.NotifyIcon}func NewMyWindow() *MyWindow {mw := new(MyWindow)var err errormw.MainWindow, err = walk.NewMainWindow()checkError(err)return mw}func (mw *MyWindow) init() {http.HandleFunc("/", handler)}func (mw *MyWindow) RunHttpServer() error {return manners.ListenAndServe(":8080", http.DefaultServeMux)}func (mw *MyWindow) AddNotifyIcon() {var err errormw.ni, err = walk.NewNotifyIcon()checkError(err)mw.ni.SetVisible(true)icon, err := walk.NewIconFromResourceId(3)checkError(err)mw.SetIcon(icon)mw.ni.SetIcon(icon)startAction := mw.addAction(nil, "start")stopAction := mw.addAction(nil, "stop")stopAction.SetEnabled(false)startAction.Triggered().Attach(func() {go func() {err := mw.RunHttpServer()if err != nil {mw.msgbox("start", "start http server failed.", walk.MsgBoxIconError)return}}()startAction.SetChecked(true)startAction.SetEnabled(false)stopAction.SetEnabled(true)mw.msgbox("start", "start http server success.", walk.MsgBoxIconInformation)})stopAction.Triggered().Attach(func() {ok := manners.Close()if !ok {mw.msgbox("stop", "stop http server failed.", walk.MsgBoxIconError)} else {stopAction.SetEnabled(false)startAction.SetChecked(false)startAction.SetEnabled(true)mw.msgbox("stop", "stop http server success.", walk.MsgBoxIconInformation)}})helpMenu := mw.addMenu("help")mw.addAction(helpMenu, "help").Triggered().Attach(func() {walk.MsgBox(mw, "help", "http://127.0.0.1:8080", walk.MsgBoxIconInformation)})mw.addAction(helpMenu, "about").Triggered().Attach(func() {walk.MsgBox(mw, "about", "http server.", walk.MsgBoxIconInformation)})mw.addAction(nil, "exit").Triggered().Attach(func() {mw.ni.Dispose()mw.Dispose()walk.App().Exit(0)})}func (mw *MyWindow) addMenu(name string) *walk.Menu {helpMenu, err := walk.NewMenu()checkError(err)help, err := mw.ni.ContextMenu().Actions().AddMenu(helpMenu)checkError(err)help.SetText(name)return helpMenu}func (mw *MyWindow) addAction(menu *walk.Menu, name string) *walk.Action {action := walk.NewAction()action.SetText(name)if menu != nil {menu.Actions().Add(action)} else {mw.ni.ContextMenu().Actions().Add(action)}return action}func (mw *MyWindow) msgbox(title, message string, style walk.MsgBoxStyle) {mw.ni.ShowInfo(title, message)walk.MsgBox(mw, title, message, style)}func main() {mw := NewMyWindow()mw.init()mw.AddNotifyIcon()mw.Run()}func checkError(err error) {if err != nil {log.Fatal(err)}}


0 0
原创粉丝点击