forked from go/golangs_learn
				
			
				 5 changed files with 89 additions and 290 deletions
			
			
		| 
		 Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 6.3 KiB  | 
								
									Binary file not shown.
								
							
						
					@ -1,265 +0,0 @@ | 
				
			|||
// +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, service2, service3 myService | 
				
			|||
 | 
				
			|||
func init() { | 
				
			|||
	app.title = "XXXX管理系统-运行监控" | 
				
			|||
	service1 = myService{ | 
				
			|||
		text:        "数据存储库", | 
				
			|||
		serviceName: "GWY20_Mysql", | 
				
			|||
	} | 
				
			|||
	service2 = myService{ | 
				
			|||
		text:        "Web服务(nginx)", | 
				
			|||
		serviceName: "nginx", | 
				
			|||
	} | 
				
			|||
	service3 = myService{ | 
				
			|||
		text:        "公务员系统", | 
				
			|||
		serviceName: "GWY20_Tomcat", | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func main() { | 
				
			|||
	_ = getWindows() | 
				
			|||
 | 
				
			|||
	walk.App().SetProductName(app.title) | 
				
			|||
	walk.App().SetOrganizationName("dwt") | 
				
			|||
 | 
				
			|||
	_ = service1.labelState.SetText("未安装") | 
				
			|||
	_ = service2.labelState.SetText("未安装") | 
				
			|||
	_ = service3.labelState.SetText("未安装") | 
				
			|||
	service1.btnStart.Clicked().Attach(func() { | 
				
			|||
		startService(service1) | 
				
			|||
	}) | 
				
			|||
	service1.btnStop.Clicked().Attach(func() { | 
				
			|||
		stopService(service1) | 
				
			|||
	}) | 
				
			|||
	service2.btnStart.Clicked().Attach(func() { | 
				
			|||
		startService(service2) | 
				
			|||
	}) | 
				
			|||
	service2.btnStop.Clicked().Attach(func() { | 
				
			|||
		stopService(service2) | 
				
			|||
	}) | 
				
			|||
	service3.btnStart.Clicked().Attach(func() { | 
				
			|||
		startService(service3) | 
				
			|||
	}) | 
				
			|||
	service3.btnStop.Clicked().Attach(func() { | 
				
			|||
		stopService(service3) | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	go flushServiceStat(service1) | 
				
			|||
	go flushServiceStat(service2) | 
				
			|||
	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:     "启动", | 
				
			|||
							}, | 
				
			|||
						}, | 
				
			|||
					}, | 
				
			|||
					Label{Text: service2.text}, | 
				
			|||
					Label{AssignTo: &service2.labelState, Text: "正在运行"}, | 
				
			|||
					Composite{ | 
				
			|||
						Layout:  HBox{}, | 
				
			|||
						MaxSize: Size{132, 30}, | 
				
			|||
						Children: []Widget{ | 
				
			|||
							PushButton{ | 
				
			|||
								AssignTo: &service2.btnStop, | 
				
			|||
								MaxSize:  Size{60, 30}, | 
				
			|||
								Text:     "停止", | 
				
			|||
							}, | 
				
			|||
							PushButton{ | 
				
			|||
								AssignTo: &service2.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 | 
				
			|||
} | 
				
			|||
@ -0,0 +1,43 @@ | 
				
			|||
{ | 
				
			|||
    "FixedFileInfo": { | 
				
			|||
        "FileVersion": { | 
				
			|||
            "Major": 1, | 
				
			|||
            "Minor": 0, | 
				
			|||
            "Patch": 0, | 
				
			|||
            "Build": 0 | 
				
			|||
        }, | 
				
			|||
        "ProductVersion": { | 
				
			|||
            "Major": 1, | 
				
			|||
            "Minor": 0, | 
				
			|||
            "Patch": 0, | 
				
			|||
            "Build": 0 | 
				
			|||
        }, | 
				
			|||
        "FileFlagsMask": "3f", | 
				
			|||
        "FileFlags ": "00", | 
				
			|||
        "FileOS": "040004", | 
				
			|||
        "FileType": "01", | 
				
			|||
        "FileSubType": "00" | 
				
			|||
    }, | 
				
			|||
    "StringFileInfo": { | 
				
			|||
        "Comments": "公务员服务", | 
				
			|||
        "CompanyName": "北京神舟航天软件技术有限公司", | 
				
			|||
        "FileDescription": "公务员服务运行监控软件", | 
				
			|||
        "FileVersion": "v1.0", | 
				
			|||
        "InternalName": "运行监控", | 
				
			|||
        "LegalCopyright": "Copyright (c) 2021", | 
				
			|||
        "LegalTrademarks": "", | 
				
			|||
        "OriginalFilename": "HyServer.exe", | 
				
			|||
        "PrivateBuild": "", | 
				
			|||
        "ProductName": "监控软件", | 
				
			|||
        "ProductVersion": "V2021_1.0.1", | 
				
			|||
        "SpecialBuild": "" | 
				
			|||
    }, | 
				
			|||
    "VarFileInfo": { | 
				
			|||
        "Translation": { | 
				
			|||
            "LangID": "0409", | 
				
			|||
            "CharsetID": "04B0" | 
				
			|||
        } | 
				
			|||
    }, | 
				
			|||
    "IconPath": "main.ico", | 
				
			|||
    "ManifestPath": "" | 
				
			|||
} | 
				
			|||
					Loading…
					
					
				
		Reference in new issue