// +build windows // +build 386 package main import ( "fmt" "github.com/lxn/walk" . "github.com/lxn/walk/declarative" "github.com/lxn/win" "golang.org/x/sys/windows" "os/exec" "syscall" "time" ) type myApp struct { title string msg *walk.TextEdit mw *walk.MainWindow } type myService struct { text string serviceName string labelState *walk.Label btnStart *walk.PushButton btnStop *walk.PushButton } var app myApp var service1, service3 myService func init() { app.title = "公务员管理系统-运行监控" service1 = myService{ text: "数据存储库", serviceName: "GWY20_Mysql", } service3 = myService{ text: "公务员系统", serviceName: "GWY20_Tomcat", } } func main() { _ = getWindows() walk.App().SetProductName(app.title) walk.App().SetOrganizationName("dwt") _ = service1.labelState.SetText("未安装") _ = service3.labelState.SetText("未安装") service1.btnStart.Clicked().Attach(func() { startService(service1) }) service1.btnStop.Clicked().Attach(func() { stopService(service1) }) service3.btnStart.Clicked().Attach(func() { startService(service3) }) service3.btnStop.Clicked().Attach(func() { stopService(service3) }) go flushServiceStat(service1) go flushServiceStat(service3) app.mw.Show() app.mw.Run() } func setServiceState(service myService, msg string, btnStartStatus bool, btnStopStatus bool) { _ = service.labelState.SetText(msg) service.btnStart.SetEnabled(btnStartStatus) service.btnStop.SetEnabled(btnStopStatus) } // 刷新服务状态的协程程序 func flushServiceStat(service myService) { for { winService, err := NewWinService(service.serviceName) if winService == nil || err != nil { if err == windows.ERROR_SERVICE_DOES_NOT_EXIST { setServiceState(service, "未安装", false, false) } else { setServiceState(service, "服务打开失败", false, false) } } else { if winService.IsStop() { setServiceState(service, "已经停止", true, false) } else if winService.IsRunning() { setServiceState(service, "正在运行", false, true) } } time.Sleep(time.Second) } } // 启动服务 func startService(service myService) { s, err := NewWinService(service.serviceName) if s == nil || err != nil { return } showMsg(service.serviceName + " 服务开始启动......") err = s.StartService() if err != nil { showMsg(service.serviceName + " 服务启动失败!") } else { showMsg(service.serviceName + " 服务启动成功。") } } // 停止服务 func stopService(service myService) { s, err := NewWinService(service.serviceName) if s == nil || err != nil { return } showMsg(service.serviceName + " 服务开始停止......") err = s.StopService() if err != nil { showMsg(service.serviceName + " 服务停止失败!") } else { showMsg(service.serviceName + " 服务停止成功。") } } func showMsg(msg string) { app.msg.AppendText(time.Now().Format("2006-01-02 15:04:05 ")) app.msg.AppendText(msg) app.msg.AppendText("\r\n") } // 初始始化窗体 func getWindows() error { icon, _ := walk.NewIconFromResourceId(3) err := MainWindow{ Visible: false, AssignTo: &app.mw, Title: app.title, Size: Size{500, 360}, Font: Font{Family: "微软雅黑", PointSize: 9}, Icon: icon, Layout: VBox{}, Children: []Widget{ GroupBox{ Title: "基础服务状态", Layout: Grid{Columns: 3}, Children: []Widget{ Label{Text: service1.text, MinSize: Size{220, 30}, TextColor: walk.RGB(255, 255, 0)}, Label{AssignTo: &service1.labelState, Text: "正在运行", MinSize: Size{80, 30}}, Composite{ Layout: HBox{}, MaxSize: Size{132, 30}, Children: []Widget{ PushButton{ AssignTo: &service1.btnStop, MaxSize: Size{60, 30}, Text: "停止", }, PushButton{ AssignTo: &service1.btnStart, MaxSize: Size{60, 30}, Text: "启动", }, }, }, }, }, GroupBox{ Title: "业务服务状态", Layout: Grid{Columns: 3}, Children: []Widget{ Label{Text: service3.text, MinSize: Size{220, 30}}, Label{AssignTo: &service3.labelState, Text: "正在运行", MinSize: Size{80, 30}}, Composite{ Layout: HBox{}, MaxSize: Size{132, 30}, Children: []Widget{ PushButton{ AssignTo: &service3.btnStop, MaxSize: Size{60, 30}, Text: "停止", }, PushButton{ AssignTo: &service3.btnStart, MaxSize: Size{60, 30}, Text: "启动", }, }, }, }, }, TextEdit{AssignTo: &app.msg, VScroll: true, ReadOnly: true}, Composite{ Layout: HBox{}, Children: []Widget{ PushButton{ MinSize: Size{160, 30}, Text: "打开windows服务管理程序", OnClicked: func() { c := exec.Command("cmd", "/C", "SERVICES.MSC") c.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} // 不显示命令窗口 if err := c.Start(); err != nil { showMsg(fmt.Sprintf("打开windows服务管理程序失败, 错误信息: %s", err)) } }, }, HSpacer{}, PushButton{ MinSize: Size{121, 30}, Text: "关闭本监控窗口", OnClicked: func() { walk.App().Exit(0) }, }, }, }, }, OnSizeChanged: func() { _ = app.mw.SetSize(walk.Size(Size{500, 360})) }, }.Create() winLong := win.GetWindowLong(app.mw.Handle(), win.GWL_STYLE) // 不能调整窗口大小,禁用最大化按钮 win.SetWindowLong(app.mw.Handle(), win.GWL_STYLE, winLong & ^win.WS_SIZEBOX & ^win.WS_MAXIMIZEBOX & ^win.WS_SIZEBOX) // 设置窗体生成在屏幕的正中间,并处理高分屏的情况 // 窗体横坐标 = ( 屏幕宽度 - 窗体宽度 ) / 2 // 窗体纵坐标 = ( 屏幕高度 - 窗体高度 ) / 2 _ = app.mw.SetX((int(win.GetSystemMetrics(0)) - app.mw.Width()) / 2 / app.mw.DPI() * 96) _ = app.mw.SetY((int(win.GetSystemMetrics(1)) - app.mw.Height()) / 2 / app.mw.DPI() * 96) return err }